![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线段树&&树链剖分&&LCA&&主席树
YYyyCCCcccBb
觉得为时已晚的时候,恰恰是最早的时候。
展开
-
覆盖的面积 HDU - 1255 线段树-扫描线
思路:建议先做HDU 1542Atlantis 是一样的题,不妨先A了 1542再来搞这题。改变的只是求矩阵的交, 那么我们只是要考虑如何能找到一个区域可以被重复的覆盖即可。只要找到cover标记,如果是>1的 则表示这个线左侧有至少两条,那么必定是交区域#include#include#include#include原创 2017-05-13 15:57:20 · 310 阅读 · 0 评论 -
HDU 5893 List wants to travel(树链剖分-区间合并-区间更新-入边)
题意:找书上路径的有多少种不同颜色的更换思路:和网上说的一样。。先刷了染色(树链剖分-入点)再来刷这题。。然而发现和直接给点权值不同,给边权值显然麻烦的多,做了两个小时,也没讨论清楚。找了篇思路清晰的博客改了改查询部分就AC了。查询部分有详细注释,就不多记录了,当板子直接上代码#include #include #include #include #include #in原创 2017-08-29 16:04:01 · 244 阅读 · 0 评论 -
Weak Pair HDU - 5877 (dfs+线段树!!有根树!!)
题意:给出了一棵有根树!! 注意有根树!! 询问满足条件的一个节点与其祖先节点的乘积小于K的总和思路:因为是有根树,所有不能造双向边,因为这个和这题玩了一下午。。对于每个节点深搜下去,每次更新线段树,注意要离散化! 因为数字很大,但节点不多每次查找的思路是 查找他祖先节点的 满足条件的区间。在回溯时注意将该节点的值删除掉#include#include#includ原创 2017-08-28 16:05:32 · 256 阅读 · 0 评论 -
hdu 4729 An Easy Problem for Elfness (树链剖分-入边-二分-查区间最值)
题意:有K的经费,询问从a->b 通过两种途径取得最大流量是多少途径1: 加任意的边途径2:扩充任意的边思路:对于每一个操作来说,如果ab的直接连的边必定最合算如果a>b,那么有两种,第一是扩展原有的边。第二是加一条a->b的边,扩展a->b的边一开始想复杂了,去搜了下,发现是个很模板的题,但是二分的左边界要处理好。否则会TLE。这题当入边的板子吧!入边入点在编号节点I原创 2017-08-24 09:19:55 · 275 阅读 · 0 评论 -
hdu 6047 Maximum Sequence
题意:把b数组中 b[i]~n放到a[i+n]的位置思路: 区间最值查#include #include #include #include using namespace std;const int maxn= 250005*2;const int inf=0x3f3f3f3f;int a[maxn];int b[maxn];const int mod=10原创 2017-07-27 19:20:07 · 305 阅读 · 0 评论 -
hdu-6074 Phone Call (LCA+并查集)
题意:给出若干条电话线,询问可以最多连几个房子,最小代价思路:先将轻重链划分出来,不仅仅是为了找LCA,也是为了在合并的时候以轻重链logn的特点,不断合并。划分为若干条轻重链后,用最小生成树的思想来构造,在(a,b)这个区间内,区间内自己连接,也就是找到a,b的LCA,之后合并到LCA上!c.d同理在a,b 与c,.d的关系上,只需要直接调用fa【】 合并即可。并查集合并时维原创 2017-08-04 12:07:36 · 803 阅读 · 0 评论 -
hdu 6070 Dirt Ratio(线段树+二分)
题意: 给出的题目id表示几次AC,询问区间中最少的通过率思路:比赛时,不会枚举区间长度,题解的标程里写的很明白,涨姿势。。Siz(l,r) 区间内的元素个数/ 区间长度 但是元素个数的求法很有意思。在离线线段树时,可以解决区间内不同元素个数的问题。这次的想法感觉和离线的差不多,都是边更新,边查询。每一次插入后,都会更新一段。而查找答案时,则是每次都必定会查找所有的原创 2017-08-04 10:23:31 · 233 阅读 · 0 评论 -
SPOJ DQUERY D-query(离线线段树,查区间不同数字个数)
题意: 找区间不同数字思路:先把所有操作记录下来,之后按查询的右端点排序,如果数字存在update -1 否则udpate+1#include #include #include #include using namespace std;const int maxn=300005;struct node{ int l,r,sum;} tree[maxn*4]原创 2017-07-19 16:05:25 · 1541 阅读 · 0 评论 -
HDU-3727 Jewel(查询第K大是几,以及数字是第几大)
题意:插入操作1查询 S~T 第K是几2查询 X是当前的第几小3操作当前第K小是几思路:建立主席树 ,三种基本操作#include #include #include #include #include using namespace std;struct node{ int lc,rc,num;} tree[2000010];int原创 2017-07-19 11:28:48 · 331 阅读 · 0 评论 -
hdu-4417-Super Mario(无修改的主席树-求小于等于k的个数)
题意:找出给出区间内小于等于 k的个数思路;建立主席树,查找时,如果j树的 最大值都小于k,直接求和,否则分步求和。也可以用离线的线段树做,觉得线段树更好想一些#include#include#include#includeusing namespace std;const int maxn=100010;struct node{ int l,lc,rc,原创 2017-07-18 15:39:58 · 504 阅读 · 0 评论 -
HDU5869 Different GCD Subarray Query(离线线段树)
题意:找l~r区间中各个字串构成的gcd ,有多少种思路:可以分离处区间中有多少不同数字,这可以用离线的线段树方式处理。也就是按r端点排序,从左向右,使得值尽可能的往右靠。处理gcd的方法可以从左向右推,区间gcd的收敛程度很高,暴力即可。还有一个问题是在于保存gcd的时候,一定要使其(是从哪个l 推出来的, 这个l尽可能的靠近r)只有这样才能保证在离线处理时,不出错!#i原创 2017-07-22 11:50:51 · 277 阅读 · 0 评论 -
URAL 1553 Caves and Tunnels(树链剖分-点更新-区间最值查)
题意:操作1.点权+w操作2.查询u->v点这条路径最大值#pragma comment(linker, "/STACK:102400000,102400000")#include #include #include #include using namespace std;const int inf=0x3f3f3f3f;const int maxn = 100005原创 2017-07-21 14:47:16 · 223 阅读 · 0 评论 -
Triple HDU - 5517
题意:给出 A集合 (每个元素有两个数字)与 B集合(有三个数字), 如果A集合的最后一个数字 与B集合的最后一个数字相等。就可以造出C集合中的一个元素a c d 。最后询问C集合中 有多少个元素没有比他大的思路:用去重的思想构造出acd这些元素。 之后 a c d这类元素按 a,c,d的顺序从大到小排序,在线段树更新的过程中,因为a元素从大到小,c元素作为边界left,查找原创 2017-09-29 13:35:17 · 247 阅读 · 0 评论 -
hdu 5023-A Corrupt Mayor's Performance Art
题意: 给出每次更改和查询,询问区间中有多少种不同颜色。注意初始全部为2号颜色思路:状压每种颜色,查询时候看1出现的状态位#include #include #include #include #include #include using namespace std;const int maxn=1000005; int vis[maxn]; long long a原创 2017-10-11 15:52:27 · 192 阅读 · 0 评论 -
Atlantis HDU - 1542 (线段树扫描线-矩阵面积和)
题意:给出矩阵的左下角点和右上角点,询问这些矩阵构成的图里,覆盖的面积和,重复覆盖的只算一次。理解:这是一个模板题,今天也是才弄懂写一下自己对他的理解。网上有一个图http://blog.csdn.net/wlxsq/article/details/47254571#。 画的很不错。个人感觉他与普通线段树的区别在于,这颗线段树的l~r记载的是纵坐标的区间,x记载了再当前位置 最原创 2017-05-13 15:47:13 · 332 阅读 · 0 评论 -
2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Xor
题意:给出树的u,v节点询问每隔K个取一个数字异或。思路:是卡过去的。。竟然没TLE。找U点和V点的LCA,之后从U点先向上用ST算法找到第K个祖先,依次类推。 之后再V点再重新处理向上找。注意在找完U后,可能LCA并不是K的位置。因此V点的起始位置要特判#includeusing namespace std;#define rank Rank#define pb pus原创 2017-09-16 18:14:30 · 1682 阅读 · 0 评论 -
HDU 4819 Mosaic (二维线段树)
题意:给出一个矩阵,要求每次 X+L/2 ,X-L/2 Y+L/2, Y-L/2 区间的最大值和最小值的平均值并且拿这个值更新。思路: 套kuangbin的板子。。。加了写注释存下来。感觉这题很套路 #include #include #include #include #include #include #include #include #include #i原创 2017-10-12 16:38:41 · 205 阅读 · 0 评论 -
染色 HYSBZ - 2243 (线段树,区间合并,树链剖分)
这题交了30多次,比这别人的代码写,最后才弄懂。记得还有一道网络赛的题与他类似。思路:change操作很简单,难点在于区间操作。区间的合并只是一个简单的线段树的区间合并,要注意的是在查询颜色段的时候需要类比于正向查询时,要反向查询fa[tpu]与tpu的颜色关系,如果相同需要-1。在区间查询时候,要需要注意记录当前的最右侧颜色,因为需要用它来与下一次查询的最左侧值来做比较,如果同则-1原创 2017-06-04 10:34:16 · 460 阅读 · 0 评论 -
树的统计Count HYSBZ - 1036 (树链剖分,点更,区间最值,和查询)
思路:裸树链剖分+线段树。给出的是点,直接做就好,注意有-值#pragma comment(linker, "/STACK:102400000,102400000")#include #include #include #include using namespace std;const int inf=0x3f3f3f3f;const int maxn = 300原创 2017-06-03 19:45:40 · 333 阅读 · 0 评论 -
hdu-4348-To the moon(主席树更新,区间更新,区间和查询,保存历史版本返回)
题意:给出指定的多种操作,询问每步结果思路;主席树来保存每一步的版本,在求值时调用相应的记录。区间更新,区间和查询#include#include#include#define clr(x) memset(x,0,sizeof(x))#define LL long longusing namespace std;struct segtree{ int lt,r原创 2017-07-18 11:19:01 · 393 阅读 · 0 评论 -
Feed the dogs POJ - 2761 (主席树第K大)
题意:找l~r第k大的数#include #include #include #include using namespace std;const int maxn=100001;int a[maxn];int root[maxn*20];struct node{ int lc,rc,num;}tree[maxn*20];int cnt,rnu,now,num原创 2017-07-19 15:33:39 · 277 阅读 · 0 评论 -
hdu 5493 Queue 线段树
题意:给出人的身高,以及他前面可能有多少个人比他高,或者后面多少个人比他高,寻找一个典序最小符合条件的序列思路:对于每个位置,用线段树留空的思想来插,类似于poj排队买票的那种线段树插空的题。注意要先询问当前空位置是否够#include #include using namespace std;const int N=1e6+5;struct node{ int n原创 2017-10-14 12:07:14 · 165 阅读 · 0 评论 -
Count on a tree SPOJ - COT (LCA+主席树)
题意:在树上找到u->v的第K大思路:root[a]+root[b]-root[lca(a,b)]-root[fa[lca(a,b)]]上的第k大,具体说下代码,先找LCA(这里是用树链剖分的思想求的LCA),之后每一个树的节点,都维护一棵子树, 这两棵树不属于同一类,因此用不同的标号来记录 #includeusing namespace std; const in原创 2017-07-21 17:13:47 · 344 阅读 · 0 评论 -
Different GCD Subarray Query HDU - 5869 (gcd处理+离线线段树·)
题意: 找l~r区间不同gcd个数思路:第二次做这题了。又卡住了。离线线段树部分就是让新的gcd尽可能的向右更新。但是感觉主要的问题是在于gcd的处理,对于每个gcd的起点,需要记录一下。而且也需要再处理的时候保证没有重复的gcd,且这个gcd的位置尽可能的靠右。做法是把gcd从大到小放进去,之后再逐次取出,只有当不等时,才更新位置和值#include #include原创 2017-08-25 13:16:35 · 317 阅读 · 0 评论 -
hdu 6162 Ch’s gift(主席树+树链剖分)
题意:给出一棵树的链接方法,每个点都有一个数字,询问U-》V节点经过所有路径中l 思路:维护一个主席树,对于每一个节点来说,都更新自己这个节点的一条链。建立轻重链找LCA,不难发现每一个u->v来说。都是找root[u]+ root[v] -root[lca] -root[fa[lca]]。只是L,R的脚标要处理好,因为这个WA了好久。。#includeusing n原创 2017-08-22 18:47:09 · 850 阅读 · 0 评论 -
线段树--区间更新-区间查询HDU 1698
题意: 给钩子的价值更新,给出区间,查找区间价值思路:加lazy标记,不必更新到每个#include #include #include #include #define lson i#define rson iusing namespace std;struct TreeNode{int lazy,val,left,right,tag;}Tree[原创 2016-08-10 18:48:59 · 525 阅读 · 0 评论 -
SPOJ QTREE Query on a tree(树链剖分-点更新-区间最值查询-入边)
题意:操作1.更改第i条边权值操作2.查询i->j的路径最大值操作3 跳出#include #include #include #include using namespace std;const int maxn = 100005;int dep[maxn],siz[maxn],fa[maxn],id[maxn],son[maxn],val[maxn],top[ma原创 2017-07-21 14:23:26 · 227 阅读 · 0 评论 -
HDU 5919 Sequence II (主席树,不同元素个数+第K大)
题意:看别人写的题意没看懂。。建议去看题,提示写的很明白。大体意思是,找到处理过后的l~r区间中, 假设不同元素个数为k , 则就找l~r中的 --- 不同元素的脚标,从小到大排序后 ---第(k+1)/2个元素思路:倒序方式来处理n个数字,得到K个不同数字(主席树类型题模板),再从中拿第k个元素(此时和第k大元素处理方法相同,只不过第k大元素模板题是排序,去重过后,此题直接原创 2017-07-21 13:09:40 · 277 阅读 · 0 评论 -
D-query SPOJ - DQUERY (主席树找区间不同元素个数)
思路:建立主席树,从后到前,如果有就将其拿到前面#include #include #include #include using namespace std;const int maxn=200005;struct node{ int lc,rc,num;} tree[maxn*40];int cnt,rnu,now;int a[maxn];int num[原创 2017-07-21 10:23:40 · 348 阅读 · 0 评论 -
CodeForces 609D Gadgets for dollars and pounds
题意:有n天,m个工具,至少买k个工具,有s元。第二行第三行是 第一种 硬币 和第二种硬币的汇率。询问最少多少天可以买完。思路:二分查找答案,如果可以就左移,否则右移。在查找时,要查询的是在1-》x天内最小的汇率。可以直接排序,nlog,我用的是线段树,logn,感觉好傻。。复杂度分析没注意。。因为会TLE。找到最小汇率,取前k小的工具判断就好了#include #inc原创 2017-05-12 10:06:52 · 255 阅读 · 0 评论 -
HDU 4614Vases and Flowers(不定区间->定区间)
题意:插花和拔花的过程,1插,2拔,如果一个都不能插输出 “ ...” ,如果能插至少一朵花,但是不够插,就把其余的花扔掉思路; lazy标记为1 时表示已空, -1时表示已满,sum表示空瓶子个数,first表示最左边空瓶位置,last表示最右边空瓶位置,-1表示无自己第一次写的时候感觉的难点在于如何找到区间的右端点,发现kuangbin大神写了个二分,真是强,第一次原创 2017-05-11 15:54:19 · 224 阅读 · 0 评论 -
HDU 3974-Assign the task(dfs构建结构+裸线段树)
题意:一棵树的结构,父节点是老板,子节点是员工,每次给父节点分配的任务,立即会下分到他所有的子节点,有更新和查询命令。思路:第一次知道dfs可以用来维护某节点所管理的子节点的范围,因为dfs在回到开始点时,必定已经走过了所有子节点。在构建出一个可管理的区间后,就可以用裸线段树了#include #include #include #include #include原创 2017-05-10 18:52:34 · 547 阅读 · 2 评论 -
poj3264-Balanced Lineup(点更新,区间最值)
题意:给出每个位置奶牛高度,求出l,r这个区间段最高牛和最低的牛的差值思路:线段树维护最值#include #include #include #include using namespace std;const int maxn= 50005;const int inf=0x3f3f3f3f;int a[maxn];struct node{ in原创 2017-03-13 13:56:13 · 247 阅读 · 0 评论 -
zoj 1610 Count the Colors(线段树 区间更新)
题意:给c1~c2的区间涂色。询问最后有几段颜色区域。初始无色。思路:lazy标记,区间逐渐更新。自己最初写了一个从后往前的仅仅带标记的线段树,竟然WA了。很迷。只好规规矩矩来一遍,终于过了#include #include #include using namespace std;const int maxn=8050;struct node{ int l原创 2017-03-13 13:21:44 · 207 阅读 · 0 评论 -
HDU 3282-Running Median
题意:在奇数个数的时候输出中位数。思路:离散化,线段树,数据量很小,暴力也过#include #include #include #include #include using namespace std;typedef long long ll;struct node{ int num,id;};node a[10000];int b[100原创 2016-12-16 16:57:00 · 280 阅读 · 0 评论 -
poj2528-Mayor's posters -离散化线段树
题意:给出T组测试数据,N对数字,左和右。代表这海报粘贴的区间。可以有覆盖。询问最后有多少种海报露出来自己做的时候用了一个mp映射来将点缩小,TLE了。去看了看别人的离散优化,如下:思路:对于每个点都存到一个结构体中,id是第几号点,x是点的大小。第一次sort将点人为的离散,第二次sort把点还原,线段树就很好写了,此题关键是离散化#include #inclu原创 2016-12-08 13:24:27 · 288 阅读 · 0 评论 -
poj2828Buy Tickets
题意:插队,从第一个人开始,选择自己站到第几个位置,之后再选,后面选的可以把前面选的挤到后面思路:线段树,从后到前,存空位。PS: 自己写G++说什么都TLE,去看了看讨论区,C++才能够。#include #include #include using namespace std;const int maxn=200010;#define inf 0x3f原创 2016-12-06 17:09:40 · 256 阅读 · 0 评论 -
HDU2795-Billboard(点更点查)
题意:给出一个高h,宽w的板子,要写n条长为x的广告,问从1->h 可以写在哪个位置。思路:第一次写的时候没注意数据 造了个4*h的线段树,果断RE,再想了想n的数据很小,如果依据n来构造线段树,就解决了在构造的时候注意左,右子树的val值的更新,以及构建当前树是几号,还有就是在当前节点如果max( 左,右) #include #include #include原创 2016-12-05 20:46:02 · 180 阅读 · 0 评论 -
poj3468-A Simple Problem with Integers
题意:一串数字,C操作 从x,到y 所有数字+zQ x y 所有数字的。思路;线段树区间更新,区间查询模板题。竟然写WA了。注意long long 传参也要long long 。#include #include #include #include #define lson i<<1,left,mid#define rson i<<1|1,mid+1,righ原创 2016-12-05 19:24:13 · 173 阅读 · 0 评论 -
线段树--区间更新区间查询--hdu4027
题意:给定一串数字,再给定两个操作:0.查询 x 到 y的和1.更新 x到 y的每个值 ,使其变为根号倍Notice that the square root operation should be rounded down to integer.将有可能变成的小树变为整数#include stream>#include #include using原创 2016-08-10 19:06:55 · 232 阅读 · 0 评论