![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
题解
NOI_yzk
我爱oi oi爱我
展开
-
最优贸易简化版
最优贸易简化版 题目描述 C国有 nn 座城市,编号是 11 到 nn ,编号为 ii 的城市有路到编号为 i+1i+1 的城市(编号为 nn 的城市没有路到其他的城市)。 C国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。 商人阿龙再次来到C国旅游。他还是想贩卖水晶赚取旅费原创 2017-09-17 11:27:54 · 641 阅读 · 0 评论 -
刺杀
题目描述 乐乐做了一个神奇的梦,他成为了一名刺客。 敌人要经过一片森林,这是刺杀的好机会。敌人共有n个,每个人有一个体力值x和子弹数y,表示如果乐乐徒手打败这个人需要消耗x点体力,打败这个人之后,他就会得到一把含有y颗子弹的手枪(这把手枪可以杀死y个人)。 乐乐刚开始只有s点体力,并且没有手枪(体力消耗后不会恢复,体力不能小于0)。 乐乐刺杀一名敌人,有两种方法:通过体力肉搏或者通过开枪原创 2017-10-02 19:33:23 · 582 阅读 · 0 评论 -
最大独立子集
题目描述 独立集是指两两不相邻的节点构成的集合。 求一棵树中,独立集的个数。(空集也算独立集) 输入 第一行一个整数n,表示树中节点的个数。 第二行n-1个数,表示每个节点父亲节点的编号。父节点的编号一定小于该节点。 输出 输出一个整数,表示独立集的个数,方案数较多,对1000000007取模。这是道由2012年NOIP初赛问题求解第二道改编过来的题目 可以用树形dp的思想求解:原创 2017-10-02 19:48:36 · 1095 阅读 · 0 评论 -
USACO安全路径
这题是道神题,虽然考试时并没有时间去看这道题目由于是牛i从牛棚1到牛棚i的路径是一样的 我们可以证明:可以生成一个最小路径树同时还可得出一个定理:使变化后的路径最优,那么最多添加一条边设我们添加一条长度为len,连接x和y的边 那么它会构成一个环,且这个环的其他点都存在与x与y到其最近公共祖先的路径上(设这个环上的点为a)。 这时到这些点的路径即可更新,新的路径为newdis[a]=dis[x原创 2017-10-03 08:31:05 · 461 阅读 · 0 评论 -
道路评价
题目描述 乐乐的家乡,进行了道路改进,n户人家,用n-1条道路连接,形成一棵树。 他想通过程序来评价一下这些道路的性能。从x点到达y点时,记录一下这条路上最长的边,和最短的边。 用它们的差值来表示x到y的方便程度。 乐乐想知道任意两户人家的方便程度之和。 输入 第一行一个整数n,表示有多少户人家。 接下来n-1行,每行三个整数a、b、c,表示有一条长的为c的边,连接编号为a原创 2017-10-04 08:08:27 · 618 阅读 · 0 评论 -
引水入城
这是一道NOIP2010真题,考察了区间覆盖问题和对题干的分析分析数据可知:若一个供水点不能在干旱区覆盖一个区间,那么那些不能被覆盖到的点将永远不会被覆盖到证明:若一个供水点不能覆盖一个区间,则这个点至少覆盖了两个不相邻的点(不然就视为连续的区间),供水点到两个点的路径会构成一个闭区间,而若有路径到里面的点,则必会经过这些路径上的某个点,这与之前的条件相矛盾既然是一个区间,那么若能覆盖到所有点,则每原创 2017-10-06 15:51:24 · 326 阅读 · 0 评论 -
航线规划(离线+路径压缩)
前言: 一般来说,树具有很多图的特性 所以遇到图论题一般要把它处理成树的题目这题的提示其实是很明显的 树上的每一条边算是都是关键路径 当添入一条边后它在树上所形成的环上的边就都不是关键路径分析数据可知每次询问不可能都把路径遍历一遍 那么为了使路径不被遍历多次,那么采用路径压缩的处理方式既然题目只删边而不加边 那么关键路径应是越来越多 但并不能很轻松地算出每次更新后产生的关键路径反一个方原创 2017-10-14 21:39:33 · 812 阅读 · 0 评论 -
最大字典序排列
前言:又是一道裸的线段树题目 但有些线段树的用法还是以前没使用过的主要的卡点在于点之间是会交换顺序的 交换顺序后岂不要把整个线段树给更新了?? 事实上是不用的, 原因是,每次虽然会选出一个点放到最前面, 但是在此之后这个点就没用了,这个点仅仅会对排在它前面的点产生影响 最基础的找一个点在第几位的方法不就是一个个数过来嘛,如果把换到前面的那个点赋成0,即当这个数不存在,题目就豁然开朗了,询原创 2017-10-14 21:58:31 · 1659 阅读 · 0 评论 -
深搜专题——木棒
这是我写过剪枝最多的题目 总计九个剪枝一个优化 最关键的是奇偶性剪枝,可行性剪枝,最优性剪枝#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#define FOR(i,x,y) for(int i=(x);i<=(y);i++)#define DOR(i,x,y) for(int i=(x)原创 2017-10-15 20:01:00 · 271 阅读 · 0 评论 -
Paths(树上的贪心)
当数据为一条链的时候 很显然可以用类似于看电视的贪心按尾排序 可以把这个引申到树上首先,去每个路径的收益为一,这与看电视相似 我们应该自己创造一个顺序 使取了这个点之后,满足一段区间具有最优解我们按照路径两端点LCA的deep由深到浅排序当我们取了i这个点之后,满足i的子树不再会被取到 由于之后路径的lca的deep会大于或小于当前i的lca的deep 这里分三种情况: 1.下一个点的原创 2017-10-10 11:06:37 · 340 阅读 · 0 评论 -
买房子2
题目描述 有天小C突发奇想,自己是不是也该考虑一下买房子的问题了。小C所在的城市被划分成n个区域,这n个区域是连通的,并且从任意一个区域到达另外区域的方案数只有一种。现在这n个区域都有房卖,小C想,如果他要选择买房区域的话,他所在的区域到其他的区域的距离的最远距离是多少。现在告诉你n个区域的连接情况,请你帮他算算,输出对于每个区域离它最远的距离是多少? 输入 输入第一行,一个整数n; 接原创 2017-09-30 11:17:14 · 413 阅读 · 0 评论 -
道路改建
题目描述 一个由n户人家组成的村庄,用n-1条路径连接,形成一棵树。 现在进行道路改建,先把某条边的删除,再用这条边连接其他两个点(保持长度相同)。 使得最后村庄之间仍能相互到达,且最远的两个村庄之间的距离最小。 输入 第一行一个整数n,表示村庄的个数。 接下来n-1行,每行3个整数a、b、c,表示有一条路径连接编号为a和b的村庄(编号从0开始)。 输出 输出可以使原创 2017-09-30 10:58:50 · 813 阅读 · 1 评论 -
并查集——关押罪犯
>题目:1401关押罪犯 题目描述 S 城现有两座监狱,一共关押着N名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。每年年原创 2017-09-23 16:52:46 · 784 阅读 · 0 评论 -
看电视
> 2957.看电视 题目描述 最近有很多好看的电视节目要更新了。用[a,b]这个区间表示一个节目的播放时间。乐乐想知道如果他在[x,y]这段时间内有空,最多可以看多少个节目。请你帮他算算。 输入 第一行两个整数n,表示节目数。 接下来n行,每行两个整数a、b,表示一个节目在a时刻开始,在b时刻结束。第n+1行,一个整数m,表示有m个询问。 接下里m行,每行两个整数x、y。表示乐乐在原创 2017-09-26 16:25:01 · 714 阅读 · 0 评论 -
MIS
2947 MIS 题目描述 长度为m的递增子序列(M length IncreaseSubsequence),称为MIS。 求长度为n的序列,有多少个MIS。子序列不需要在原序列中不需要连续,但要保证相对位置。 输入 第一行两个整数n和m第二行n个整数,表示一个序列。 输出 输出MIS的个数,结果对20140921取余。 对于100%的数据,n的范围[1,10000],m原创 2017-09-26 14:15:00 · 440 阅读 · 0 评论 -
集市班车
题目描述 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的。所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车代步。但是,约翰木有钱,他租来的班车只能在集市上沿直线跑一次,而且只能停靠N个地点(所有地点都以1到N之间的一个数字来表示)。现在奶牛们分成K 个小组,第 i 组有Mi (1 ≤ Mi ≤N)头奶牛原创 2017-09-28 17:12:04 · 434 阅读 · 0 评论 -
刷漆升级
虽然说这题暴力有95, 但正解的想法还是很值得学习的 对于一个时刻更新的区间,且这个区间有许多要更新的值 使用线段树的话,在更新子树时复杂度会很高 这里采用map+分块的方法 复杂度约为O(nloglogn)#include<cstdio>#include<cmath>#include<map>using namespace std;#define M 100005#define原创 2017-10-07 22:27:48 · 388 阅读 · 0 评论 -
弹钢琴
这是一道裸的求组合数的题目 一共有两种写法 一种是用dp递推组合数 公式为C[i][j]=C[i][j−1]+C[i−1][j−1]C[i][j]=C[i][j-1]+C[i-1][j-1] i表示一共有几个数,j表示取几个数 复杂度为n*m 代码实现:sort(A+1,A+n+1);dp[0][0]=1;long long ans=0;FOR(i,1,n) { FOR原创 2017-10-08 15:41:03 · 572 阅读 · 0 评论 -
删除数字
这题也有很明显的线性关系,要求一串数字单调不递减 我们只需知道前面的那个数是否比自己大就好在预处理每个数的组成方案后,后面的就是线性dp了 枚举前一个数的方案,与后面一个数的方案 由于前面一个数的组成方案已经求出来了,可以使用前缀和+二分把这一维优化成logn 最后复杂度为n2lognn^2lognFOR(i,1,m) { FOR(j,1,Way[i]) {原创 2017-10-08 16:17:35 · 681 阅读 · 0 评论 -
四点旅行
这题有两个思考点: 1.如何快速算出所有点的最短路 2.如何快速地找出那四个点由于边权为1,所以可以使用bfs直接找最短路,复杂度为n*n,比floyd快 分析数据可知,解法不能超过n*n 我们若枚举中间两个点,其实就可以贪心地算出这两个点分别对应的最远点 但可能会重复,其实解决方案很简单,只用记录离这个点最远,第二远,和第三远的点就好了FOR(i,1,n)bfs(i); FOR(原创 2017-10-08 16:24:24 · 361 阅读 · 1 评论 -
跑步爱天天(欧拉序入门)
考试的时候已经处理出了欧拉序,但并没有关注到它的种种性质这里给出欧拉序的定义与运用 树的欧拉序是对树进行DFS的一种序列。 有两种形式: 1、在每个结点进和出都加进序列。 2、只要到达每一个结点就把他加进序列。 第一种方法得到的序列和对应的进出状态分别是: 1 2 3 3 4 4 5 5 2 6 7 7 8 8 6原创 2017-10-16 15:56:07 · 20032 阅读 · 0 评论