线段树
文章平均质量分 86
好好刷刷数据结构和图论的题目
Dan__ge
Today is difficult,tomorrow is more difficult,but the day after is beautiful.
展开
-
HDU 3619 BFS+优先队列
点击打开链接题意:给一个地图,从S走到T,然后给了钥匙的位置,地图上数字点代表如果走这个点则要消耗数字的能量,而A到E是门,一个钥匙可以开一类门,问最少消耗多少能量就可以走到T思路:对于钥匙来说,直接用状态压缩判断钥匙是否取过,然后因为是要走最小的花费,那么要用优先队列,没什么可以注意的,就是一个钥匙可以开一类门,而不是只能开一个门,注意着谢谢就应该能过,并不难的一道BFS#include原创 2016-07-15 14:34:35 · 975 阅读 · 0 评论 -
HDU 4302 线段树
点击打开链接题意:在一个0到L的坐标上,0是在某个位置摆个蛋糕,然后1是吃蛋糕,但是吃的必须是离自己最近的,若没有蛋糕就不动,若有两个蛋糕与其距离相等,那么我们选择上一步的方向来吃蛋糕,问最后这个人走了多远思路:用两个队列应该就可以很简单的完成,但是想到了线段树,就写个线段树,而线段树一样维护的是最大值和最小值,不过这两个值都是对应的位置,那么对于队列来说肯定就是也维护这两个值,然后讨论处原创 2016-07-15 13:22:44 · 945 阅读 · 0 评论 -
HDU 4308 BFS+优先队列
点击打开链接题意:从Y走到C,#代表不能走,走*的话要花费C元,P是传送门可以到达任意一个P,问最小花费思路:直接优先队列模拟一下就行,BFS搜一下,P直接记录,遇到了就判断它能到达的点能不能走就行了,easy#include #include #include #include #include #include using namespace std;typedef lo原创 2016-07-14 20:11:40 · 1427 阅读 · 0 评论 -
HDU 2828 舞蹈链可重复覆盖
点击打开链接题意:给n个灯,每个灯能保持亮的状态的条件给出,最后问能否将所有的灯都保持亮的状态,能的话输出每个开关的状态思路:明显的舞蹈链可重复覆盖嘛,列为n个灯,然后行为每个开关开还是关,所以行要有2*m行,注意的是在跑舞蹈链的时候,每一个开关只能有开或关的状态,所以我们要判断一下它对应的状态是否走过#include #include #include #include #inc原创 2016-07-14 19:30:11 · 1595 阅读 · 0 评论 -
HDU 3607 线段树
点击打开链接题意:个n个点的高度以及点上的金子数,现在从1开始走到n,要求每走一步高度要严格递增,且只能向右走,问最多可以捡到多少金子思路:这种题看起来像是dp,因为求最多什么的嘛,但是其实用线段树就可以求解,然后数据范围过大我们需要离散化一下,然后遍历每一个点,找到它的排名,然后询问1到它的排名下一位的最大值,加上它自己的金子就是走到这的最多可以获得的,然后更新这个点的金子数,依次下去到原创 2016-07-14 16:49:03 · 1256 阅读 · 0 评论 -
HDU 3605 网络流
点击打开链接题意:n个人和m个星球,现在要求n个人全部住在这m个星球上,然后每个星球能居住的人数有上限,每个人还有自己喜欢的星球并且他只会去自己喜欢的星球,问能否成功思路:很明显的一个网络流,敲之交之TLE,然后返回来一看原来边太多了,但是我们可以发现星球还是很少的,那么与有一个背包想法类似,我们用状态压缩来代替左部,而右部还是星球,那么我们拿出一个状态来判断一下是否可以住在这个星球上来连原创 2016-07-14 16:14:08 · 1334 阅读 · 0 评论 -
HDU 3599 最短路+最大流
点击打开链接题意:给n个地点及许多边,现在问你要用最短时间内有多少种不相交的最短路思路:因为要的是最短路上的边,所以先跑最短路将满足的边全部拿出来建网络流的图,然后在跑个最大流就行了因为一条边只能用一次,所以网络流就行#include #include #include #include #include #include #include #include using n原创 2016-07-13 19:38:58 · 1652 阅读 · 0 评论 -
HDU 1534 查分约束
点击打开链接题意:要完成n个任务,每个任务有完成的时间,然后下面给了四种条件,问最快完成的情况下,每一个任务的开始时间思路:四个条件就是给出的四个查分约束方程,然后因为是要时间最短,所以求得是最长路,但是因为没有起点和终点,那么我们可以添加一个起点,使它与任务点相连一个0的边,最后求出的距离就是开始的时间,然后有环则是impossible#include #include #inclu原创 2016-07-13 12:21:14 · 1124 阅读 · 0 评论 -
HDU 1384 查分约束
点击打开链接题意:给了n个区间,要求每个区间至少有C个数字出现,问满足的最小的数字个数思路:用Si代表0到i的区间内的数字个数,然后可以写出查分约束方程,对于一个区间则Sa-S(b-1)>=C的,然后隐含的一个条件就是Si-S(i-1)>=0且=的形式#include #include #include #include #include #include using name原创 2016-07-12 20:53:13 · 1400 阅读 · 0 评论 -
LIGHTOJ 1348 树链剖分
点击打开链接题意:给一个树和树上点的权值,两个操作,一个是将点的权值修改,一个是询问u到v的点权和思路:模版题,kuangbin开的这套题为什么这么模版的写的人这么少,可能大神们不屑于写这种题吧(弱哭)#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include原创 2016-07-12 11:18:05 · 1145 阅读 · 0 评论 -
FZU 2082 树链剖分
点击打开链接题意:中文思路:最基础的树链剖分,区间求和以及单点更新,结果要用long long 就没什么了#include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned long long ull;const in原创 2016-07-12 10:52:01 · 1190 阅读 · 0 评论 -
HYSBZ 2243 树链剖分
点击打开链接题意:中文思路:一看就是应该用树链剖分与线段树的结束,主要是结合什么呢,因为需要连续的一段一段的,所以我们肯定是要用区间合并,那么区间合并需要用到什么呢,就是整个区间的最左端和最右端的元素及这个区间已经形成的段数,那么我们合并的时候就要判断一下左儿子的最右端与右儿子的最左端是不是相同,然后在处理,而更新就用个懒惰标记就可以完成了,而查询一段是与正常的区间合并是一样的,但是因为是原创 2016-07-11 21:04:23 · 1506 阅读 · 0 评论 -
POJ 3237 树链剖分
点击打开链接题意:给一个树,三种操作,一个是将第I条边的权值改变,一个是将u到v的所有边的权值取反,一个是询问u到v的路径中边的最大值思路:和模版的树链剖分没什么区别,这题唯一的坑点就是线段树的懒惰标记,只要有更新操作或者查询操作就都要pushdown(),然后改权值的比较简单,单点更新,而区间取反我们可以用两个数组直接模拟,一个最大值的,一个区间最小值的,然后一旦取反了,就将最大值改为负原创 2016-07-11 16:17:35 · 1250 阅读 · 0 评论 -
POJ 2763 树链剖分
点击打开链接题意:给一个树,然后树上的边的边权,然后两个操作,一个是询问u到v的路上权值和,一个是将第几条边的权值修改思路:与SPOJ 375 的那道题目很像,都是边上的权值,然后维护一个线段树进行修改和求和就行了#include #include #include #include #include #include using namespace std;typedef原创 2016-07-11 14:14:57 · 1501 阅读 · 0 评论 -
HYSBZ 1036 树链剖分
点击打开链接题意:中文思路:和最简单的HDU 3966 一样,我们只需要用线段树维护两个值就行了,一个最大值一个和,然后注意一下的就是有的题目是点权有的题目是边权#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include原创 2016-07-11 11:15:02 · 1147 阅读 · 0 评论 -
HDU 3966 树链剖分
点击打开链接题意:给一个树,三个操作,一个询问点的权值,一个将u到v路径上的点的权值增加,一个是减少思路:还是比较裸的模版题,线段树改为区间更新就好了#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include using原创 2016-07-10 16:15:19 · 1493 阅读 · 0 评论 -
HDU 5384 AC自动机模版
点击打开链接题意:n个A,m个B,对于每个A,输出所有B在A中出现的次数思路:和AC自动机模版题2222相同,唯一的区别就是n个A不能开二维,自己处理一下就OK了#include #include #include #include #include using namespace std;typedef long long ll;const int inf=0x3f3f3f原创 2016-07-09 15:07:08 · 1355 阅读 · 0 评论 -
HDU 3681 BFS
点击打开链接题意:在一个地图中,D代表不能走,F代表起点,S为空地,Y是要收集的东西,然后G是加油站,每走一步消耗一点能量,到加油站可以加满油,但一个加油站只能用一次,问从起点出发将所有Y收集所需要的最小的油箱容量思路:这题我们可以先不管油箱直接走看需要多少步可以将所有的Y收集,若不能直接-1,然后二分这个最小的油箱的容量,里面的加油站和Y都用状态压缩来判断就行,唯一注意的就是对于一个状态原创 2016-07-09 13:48:21 · 1370 阅读 · 0 评论 -
SPOJ 375 树链剖分
点击打开链接题意:给个树和树上的权值,两个操作,Q u v,问u到v的边上的最大权值,C u v,将第u条边的权值改为v思路:今天学了学树链剖分,这题是个检验模版的题目,理论我是解释不清楚的,自己在九野聚聚那学来的一份模版#include #include #include #include #include #include using namespace std;type原创 2016-07-08 20:25:08 · 1537 阅读 · 0 评论 -
HDU 5372 线段树
点击打开链接题意:两个操作,0是添加一段线段,然后问添加的这段线段完全覆盖之前的多少个线段,然后0是将第b个添加的线段删除思路:对于一个当前添加的线段来说,它能完全覆盖的线段个数就等于大于等于这个线段的左端的数量减去大于右端点的线段数量,因为题目中有个至关重要的条件那就是每次添加的线段的长度是越来越大的,那么对于之前的线段只有大于等于左端点的才可以,这么说吧,之前的线段的左端点比当前小的,原创 2016-07-08 17:29:50 · 1517 阅读 · 0 评论 -
HDU 5361 最短路变形
点击打开链接题意:给了n个点排成一行,每两个距离为1,然后对于每个点来说它有个L和R,意思是距离在L到R中间的所有点它都能到达,费用是C,问从小出发的单源所有的点的距离思路:看了网上神犇的题解有了点思路,因为每个点出去的费用都是相同的,而且费用的值大于0,那么1点直接到达的所有点的最短路就不需要在更新了,因为剩下的肯定是比它大的,那么对于这些个点我们压入队列,但是注意我们这里的dis设定为原创 2016-07-07 20:05:12 · 1937 阅读 · 1 评论 -
HDU 5352 最大流
点击打开链接题意:共有三种操作,1是代表可以将与1在一个联通块的点修复,但是最多只能修复k个,修好的点不会在破坏,2代表连接u与v,3是破坏p条道路,问最多可以修多少个点,多种情况输出字典序最小的思路:每次的1我们直接暴力的将与它在一个联通块的点加进来,然后为了保证原创 2016-07-06 14:34:24 · 1259 阅读 · 0 评论 -
HDU 5336 BFS
点击打开链接题意:有n个水池,每个水池目前的水滴数量给你了,一旦水池中的水滴数量大于4,这个水池就会爆,并且分成四个水滴向四个方向出发,水滴只有两种情况,一是走出地图二是碰到水池,现在给你一个爆炸点,这个点会向四个方向发射水滴,问你t秒后的所有点的状态,水滴一秒移动一个格思路:就是用bfs去模拟一下每个水滴的状态,因为时间是10000,而水池共有100个,那么最坏的复杂度就是4000000原创 2016-07-05 20:28:22 · 1714 阅读 · 0 评论 -
HDU 5335 BFS
点击打开链接题意:从左上角走到右下角的路径中要求所有数字组成的二进制最小思路:考虑如果第一个元素不是1的话,该怎么办,因为要求前缀0不输出,那么我们找到所有的0可以走到的1,然后在处理,因为要这个二进制数最小,所以它的长度越短越好,那么对于所有0到达的第一个1,我们找到与终点的最近距离,然后将满足的全部放进容器中,如果第一个是1的话,也一样进去的只能是第一个元素,然后现在的元素到终点的距离原创 2016-07-05 18:51:26 · 1759 阅读 · 0 评论 -
HDU 5316 线段树区间合并
点击打开链接题意:对数字序列有两个操作,1是将值修改,而0是询问a到b的最大值,最大值定义为所选的相邻的数的下标一个为偶数一个为奇数思路:肯定是线段树的题目,因为有这样的限制条件那么会用到线段树的区间合并,而这道题我们可以找最大值的情况很多,1可以是奇数开头奇数结束的,2可以是奇数开头偶数结束的,3可以是偶数开头奇数结束的,4可以是偶数开头偶数结束的,所以我们最后的最大值也要在这四个里面选原创 2016-07-04 19:38:52 · 2074 阅读 · 0 评论 -
FZU 2150 BFS
点击打开链接题意:一个地图上有许多草堆,每次可以选择两个草堆点燃,这两个可以使一个,然后每秒它会烧到相邻的四个草堆,若是空地则不再燃烧思路:我们可以将每个草堆点燃的所有时间处理出来,然后枚举任意两个求一下就行了#include #include #include #include #include #include #include using namespace std;原创 2016-07-03 13:47:42 · 1584 阅读 · 0 评论 -
HDU 3582 BFS
点击打开链接题意:迷宫从起点走到终点,问能否走到,K是钥匙,L是门,每个钥匙只能用一次然后*是障碍,点是空地思路:这题开始写到AC竟然错了30+,20+的MLE,因为自己写SB了,先说说我MLE的经验把,对于一把钥匙来说,我只能捡一次但是对于不同状态来的是要区分的,之前我写的就是不管什么状态来的我都要把钥匙捡起来,MLE,发现后又WA了几发,我们在队列里的状态要把哪个钥匙捡起来做个标记,防原创 2016-07-02 21:06:55 · 2109 阅读 · 0 评论 -
HDU 5289 RMQ+尺取
点击打开链接题意:给一个数字序列然后问你有多少个区间的最大值与最小值的差小于k,输出思路:对于最大值与最小值的差我们直接用RMQ的ST可以快速求得,然后求当前的i到后面哪里是都可以的,这个与尺取的思想如出一辙,直接求出来就行了,输出注意用long long 就行了,没什么难的#include #include #include #include #include using na原创 2016-07-01 16:24:59 · 591 阅读 · 0 评论 -
HDU 3584 树状数组
点击打开链接题意:三维的空间中有两个操作,初始时每个空间元素均为0,然后更新操作是0变1,1变0,是一个空间内的所有元素都更新,然后查询是问这个点的元素是0还是1思路:因为不好去更新到每一个点,那么我们可以统计空间的翻转的次数,然后用三维的树状数组即可,但是更新时不能只更新那个点,因为如果这样能的话,能够包括这个区间的大区间因为还没有更新过而和变成了1,那不是我们要的,所以我们将包围这个区原创 2016-06-30 20:03:13 · 2049 阅读 · 2 评论 -
HDU 2642 树状数组
点击打开链接题意:给个二维矩阵,矩阵有0或者1两个值,然后有三个操作,Q问区间和,剩下两个是更新点的值思路:更新点的值直接更新就行了,然后询问区间和的时候就处理一下,每次问的是X1,Y1到X2,Y2的区间和,而树状数组的和是从1,1开始的,所以总的减去多于的在加上多减去的就OK了#include #include #include #include #include using原创 2016-06-30 19:45:35 · 1690 阅读 · 0 评论 -
HDU 3592 查分约束+判环
点击打开链接题意:有N个人,然后X个关系和Y个关系,X关系代表的是这两个人的距离不能超过C,Y代表的是这两个人的距离要大于等于C,若不能满足所有的输出-1,若1与N的位置可以无穷大输出-2,否则输出两个人的最大距离思路:就是查分约束的模型,X个关系按照位置建边,Y也是直接按位置建边就行了,就是两个初始方向不同,然后有负环的话就输出-1,距离无穷大输出-2,否则就是dis[N]的值就行了,自原创 2016-06-30 18:16:12 · 1811 阅读 · 1 评论 -
HDU 3564 线段树+简单DP
点击打开链接题意:N个数从1到N,按照顺序插入到这N个位置,然后每插完一个求LIS思路:不可能插一个求一次,换个想法先将每个点在序列中的位置求出来,然后在位置的基础上求LIS就可以了,因为插入的时候当前插入的这个点肯定是最大的,所以位置当成数值求LIS就是正确的#include #include #include #include #include using names原创 2016-06-29 14:18:03 · 1457 阅读 · 0 评论 -
HDU 3577 线段树区间更新
点击打开链接题意:一辆火车,同一时间最多可以坐K个人,然后n个人依次买票,上车时间为a,下车时间为b,问这个人能不能上去,最后将所有的可以上车的人输出思路:将所有的时间看成区间,然后对于a到b,询问这段中被覆盖的最大次数,若不超过K,说明这个人可以上这段,然后更新就好了#include #include #include #include #include using names原创 2016-06-29 16:18:32 · 1637 阅读 · 0 评论 -
UVA 11354 LCA+最小生成树
点击打开链接题意:给一个无向图,然后有Q次询问U V,问的是U到V的所有路径中的最小值最大思路:U到V的路径最小值最大,则这条边肯定是最小生成树上的边,那么我们可以先将所有的最小生成树上的边全都找出来,然后现在是一个树,然后跑一边LCA,对于现在询问的U到V,只要找到它们的最近公共祖先,然后两个点向上找到它,比较路径中的最大值即可 PS:这么暴力找跑得有点慢#include #incl原创 2016-06-28 19:17:35 · 1714 阅读 · 0 评论 -
HDU 4912 LCA+策略
点击打开链接题意:给了一个树,然后m条路径,问最多可以选多少条路径而没有一个点是重复使用的,如第二组样例,3条路径是4—2—5和6—3—7和2—1—3,那么只能选前两个使得所选路径最多思路:没啥思路,看了正解竟然是LCA+贪心,好嘛可以这样考虑,对于所有的可选路径,我们先选择最下面的对上面是没有影响的,那么我们可以对每条路经的最上面的那个点进行排序,就按深度由大到小排序,然后这个最上面的点原创 2016-06-28 16:42:12 · 2148 阅读 · 0 评论 -
HDU 3572 网络流
点击打开链接题意:n个工作,m个机器来完成,每个工作有P,S,E,P代表这个工作需要P天,而S为最早开始的时间,E为最晚结束时间,每个机器在固定时间只能做一个工作,问所有的工作能否在规定时间内完成思路:因为每一天的机器只能做一个工作,那么天数肯定是一部,就是二分图的右部,然后左部应该是什么呢,那就是n个工作了,然后流量,对于每个工作来说,它需要的天数就是源点到工作的流量,然后工作到右部的就原创 2016-06-28 13:43:38 · 1544 阅读 · 0 评论 -
HDU 4836 LCA转RMQ
点击打开链接题意:中文思路:如果没有多次询问的话,就可以直接用简单的DFS与LCA就可以完成,然而却多加了个变换根的操作,那么怎么办,与刚刚写的那道点这里类似,都是可以变根的,建议先写那道再写这个,思想都是一样的,那么这道题我们也是以1为根先进行LCA与DFS,然后每次的根与询问就是那道题的换根的部分,这不太好说只能自己理解了#include #include #include #i原创 2016-06-27 18:21:18 · 1027 阅读 · 0 评论 -
PKU 1020 A Problem about Tree LCA
点击打开链接题意:给了一个树,然后m次查询,X Y,就是以X为根的Y的父节点思路:数量有点大,肯定不能暴力找了,只能找一找树上的性质了,我们先做一遍LCA,然后对于X Y,若X与Y的最近公共祖先不等于Y,则结果就是Y的父节点,现在看看若Y不是最后的祖先,那么Y的某个祖先就是最近公共祖先,也就是说它的父节点并没有变化,而剩下的那种情况则是Y就是最近公共祖先,那么这个树的位置就是要相反的了,所原创 2016-06-27 16:41:29 · 695 阅读 · 0 评论 -
POJ 3417 LCA+DFS
点击打开链接题意:给一个树,然后又在树上加了好多的边,现在问你删除一条原先的边和新加的边的一条,有多少中方法使得树不连通思路:对于新加的一条边来说,肯定会与之前的树形成一个环,而此时环内的所有边删除并且新加的这条变也删除就会是一种方案,而这道题是将所有新边都加入后的情况,那么我们看每条边,如果没有与它形成环的情况,那么这条边删除肯定会使得图不连通,那么情况就会加M,也就是和新加的M条边任意原创 2016-06-27 14:26:17 · 830 阅读 · 0 评论 -
HDU 3560 并查集
点击打开链接题意:给一个无向图,问共有多少联通块然后问这些联通块中有几个是形成一个环的,也就是每个点的度都为2思路:判断联通块直接简单的并查集就行了,然后对于每个联通块就算一下里面的所有点的度是不是2就行了,只要有一个不是2的这个联通块就不是环PS: 开头初始化时若用memset就会超时#include #include #include #include #include u原创 2016-06-26 20:29:46 · 1931 阅读 · 0 评论