----线段树
文章平均质量分 56
扩展的灰
扩展的灰(Extended Ash)
展开
-
各种杂题合集
.好久没有往blog搬运题解了,稍微总结一下1.基环树一个非常套路的题目类型,都是可以直接复制代码的那种基本操作就是,dfs找环,让后拉出来倍长,最后在上面做dp即可CodeForces 835F Roads in the Kingdom大概就是要找删掉一条边后使得树最小的直径先dp环旁边的数,找到子树的到根最长链,设为fff倍长后令Fi=Si+fi,Gi=fi−SiF_i=S...原创 2018-10-24 22:02:49 · 222 阅读 · 0 评论 -
Jzoj3591 数据
现在,二维平面上有N个点。Alex 需要实现以下三种操作:1. 在点集里添加一个点;2. 给出一个点,查询它到点集里所有点的曼哈顿距离的最小值;3. 给出一个点,查询它到点集里所有点的曼哈顿距离的最大值。 两个点的曼哈顿距离定义为它们的横坐标差的绝对值与纵坐标差的绝对值的和。这么困难的问题,Alex当然不会做,只好再次请你帮忙了。树套树裸题cdq分治第二题诶,突原创 2018-01-22 19:02:15 · 254 阅读 · 0 评论 -
Jzoj3625 旅行(travel)
非常好的树剖模板题了,直接C颗线段树上去就好了,动态开点一次写对~#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#include#define N 100010#define mid (l+r>>1)using namespace std;struct edge{ int v,nt;原创 2017-12-13 20:29:24 · 399 阅读 · 0 评论 -
Jzoj3467 最长上升子序列
维护一个序列,使它可以进行下面两种操作:1.在末尾添加一个数字x2.将整个序列变成第x次操作后的样子在每次操作后,输出当前序列的最长上升子序列的长度序列初始时为空嗯,可持久化线段树的裸题额这可是noip提高组难度的题,我们发现所有操作可以变成一棵树(离线做法老套路了)让后每次最多修改数组上的一个值(考虑二分求LIS的过程)最后改回去就好了注意dfs又卡栈(jzo原创 2017-11-25 18:58:07 · 2932 阅读 · 0 评论 -
Jzoj4061 字符串树
给一个树,每条边上面有一个字符串,每次询问两个节点路径上的字符串中有多少以给定的一个字符串为前缀显然是一个十分简单的题目,当时想多了打了树剖+Trie合并后来才意识到可以用差分+可持久化trie,过于愚蠢了。。。。。其实solution给了另一种解法,将所有字符串排序,哈希求lcp,让后存在一个数组里面,让后就可以用主席树了反正这题比较简单#pragma GCC opitm原创 2017-12-04 20:42:04 · 315 阅读 · 0 评论 -
Jzoj4746 树塔狂想曲
相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和。走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1)。如下图是一个数塔,映射到该数塔上行走的规则为:从左上角的点开始,向下走或向右下走直到最底层结束。 1 3 8 2 5 0 1 4 3 8 1 4 2 5 0路径原创 2017-11-23 20:45:17 · 290 阅读 · 2 评论 -
Jzoj1020 逆序对统计 ≈ Bzoj3295 动态逆序对
Jzoj1020:Dramatic是在太菜了。最近,他学习了有关逆序对的知识,并且掌握了计算一个序列逆序对个数的高效算法,因此,他兴冲冲的跑去向YY牛炫耀。YY牛对此不屑一顾,并打击Dramatic说:“这是在太小儿科了!”Dramatic很不甘心,于是在他的强烈要求下,YY牛给他出了一道跟逆序对有关的“难题”(显然,对于YY牛来说是简单题)。题目是这样的:YY牛首先给Dramatic一个长原创 2017-12-11 21:08:08 · 617 阅读 · 0 评论 -
Jzoj5234 外星人的路径
有一个外星人控制了你的大脑。一开始你处于原点(0,0)。外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左)。平面上有N 个关键点,每当外星人给出一个操作,你需要在这个方向上找到最近的一个关键点,并走到那个点上。保证输入数据合法。100%的数据,N,M≤100000,xi,yi≤200000。这样,我们搞2个权值线段树,一个存横坐标一个存纵坐标原创 2017-11-16 16:45:19 · 327 阅读 · 0 评论 -
Jzoj5456【NOIP2017提高A组冲刺11.6】奇怪的队列
nodgd的粉丝太多了,每天都会有很多人排队要签名。今天有n个人排队,每个人的身高都是一个整数,且互不相同。很不巧,nodgd今天去忙别的事情去了,就只好让这些粉丝们明天再来。同时nodgd提出了一个要求,每个人都要记住自己前面与多少个比自己高的人,以便于明天恢复到今天的顺序。但是,粉丝们或多或少都是有些失望的,失望使她们晕头转向、神魂颠倒,已经分不清楚哪一边是“前面”了,于是她们可能是记原创 2017-11-06 16:57:31 · 486 阅读 · 0 评论 -
Jzoj1951 布娃娃
一开始看错题目了,很容易看成i喜欢的中,让后写主席树区间第k大反过来其实也很好做,我们考虑将所有的L,R,P丢到一起考虑,分两种操作,询问和修改(是不是很像cdq分治)排个序再加上个平衡树离散化+ZKW线段树求第k大就好了(注意题目坑点:是第k大不是第k小)#pragma GCC optimize("O3")#pragma G++ optimize("O3")#includ原创 2018-01-20 17:07:25 · 356 阅读 · 0 评论 -
51nod1485 字母排序
题目看这里也是非常简单的线段树合并模板题了,虽然实际上最好的做法因该是开数组合并(这样是均摊O(1)的)不过还算跑的快,第四#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#include#define mid (l+r>>1)#define N 100010using names原创 2018-02-15 09:26:28 · 208 阅读 · 0 评论 -
51Nod1426 沙拉酱括号
题目看这里我们考虑怎样得到最大答案首先对原序列进行括号配对,没有配对上的那些可以直接扔掉不影响答案让后我们有一个合法的括号序列当一对括号与区间有相交但是不包含整个区间时,将会产生一个位置的浪费(在区间内的那个左括号或者右括号没法配对了),所以答案-1那么一个区间的答案[l,r]应该是r-l+1-与这个区间相交的括号对数+包含这个区间的括号对数(会被减重)求相交的个数可以前缀原创 2018-02-22 21:41:02 · 218 阅读 · 0 评论 -
CDQ分治&整体二分九连测
整体二分好难a CDQ分治&整体二分九连: A[适者] 先来一个不是cdq分治的题(虽然也可以用分治做) 首先先来考虑按照什么顺序来搞掉这些机甲 对于两个相邻的机甲i,j,先i后j的代价是Ai∗Di+(Di+Dj)∗AjAi∗Di+(Di+Dj)∗AjA_i*D_i+(D_i+D_j)*A_j 那么如果i应该比j先消灭就有 Ai∗Di+(Di+Dj)∗Aj<A...原创 2018-08-19 21:32:06 · 571 阅读 · 0 评论 -
51Nod1364 最大字典序排列
题目看这里一道比较简单的贪心题容易想到从前到后确定每一位我们可以用一个splay来维护当前未确定的部分的顺序假设当前剩下k次操作机会那么我们可以求出splay中前k+1个元素中的最大元素i,令k减少rank(i),让后将其输出并从splay中删掉最后k=0时,输出splay中剩余元素比题解那个线段树好写多了,主要是不用想,而且splay还挺快的#include<stdio.h>#in...原创 2018-04-27 22:03:39 · 261 阅读 · 0 评论 -
Jzoj5665 奥立卡的诗
终于又遇到SAM的题了好好玩,而且就这道题让我弄清楚了广义SAM和Trie上SAM的区别其实两者是没有多少区别的,不过Trie上SAM可以更快关于Trie上SAM,是用bfs的方法来构建的,相比起广义SAM用dfs建少了一个深度之和的部分但是如果原题给的就是Trie那么就只能用bfs了,因为dfs会被卡成O(n^2) (考虑一个扫把)回到本题,简化一下式子发现这道题求的是不同子串的原创 2018-04-20 21:18:25 · 262 阅读 · 0 评论 -
Jzoj5662 尺树寸泓
平衡树的问题,很容易想到中序遍历那么我们给每一个节点记录一下中序遍历中它子树所在的区间,一次旋转显然只会改变两个节点的值对于询问我们用线段树区间求积就可以了#pragma GCC optimize("O3")#pragma G++ optimize("O3")#include#include#include#define N 200010#define M 100000原创 2018-04-20 20:49:30 · 239 阅读 · 0 评论 -
Jzoj3351 神牛养成计划2
前文再续,书接上回,话说神牛yxr成功培育出神牛细胞,可最终培育出来的生物体却让他大失所望……后来,他从某GD女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了,神牛yxr很生气,但他知道基因突变有低频性,说不定还有一些优秀基因没有突变,那么他就可以用限制性核酸内切酶把它们切出来,然后再构建基因表达载体什么的,后面的你懂的。神牛yxr现在知道了N个细胞的D原创 2018-04-20 20:40:03 · 241 阅读 · 0 评论 -
Jzoj5605 Zkb
给定一个长度为 n 的正整数序列 a 1 ...a n . 现在有 m 次操作, 分为两种:• 1 l r t: 将区间 [l,r] 降序排序 (t = 0) 或升序排序 (t = 1)• 2 l r: 询问区间 [l,r] 内元素之积的十进制下最高位雅礼集训的题目,当时因为空间开小了爆零了先考虑一下询问,我们发现并不好直接做,所以可以对原数取log10,最后询问区间和的小数部分即可让后现在问题就...原创 2018-04-17 20:17:32 · 311 阅读 · 2 评论 -
51Nod1553 周期串查询
题目看这里我们发现需要动态维护一个字符串是否成周期根据border的一个简单性质,得出周期串的充分必要条件是,如果a[i..k]=a[j-k+1..j] 那么a[i..j]是以k为周期的串于是可以用线段树来维护哈希莫名其妙rank1..#include#include#include#define N 100010#define LL long long #def原创 2018-03-22 22:05:51 · 312 阅读 · 0 评论 -
51Nod1679 连通率
题目看这里一个简单的计数问题我们先考虑O(n^2)的做法对每个点dfs一次,求出d[i]表示i的深度,那么对答案贡献就是Σ2^(n-d[i])那么我们考虑用数据结构动态维护这个d[i],显然可以用线段树来维护dfs序做到复杂度O(n lg n) 效率很高rank8看了下solution突然才发现别人都不是这么做的!不管了反正跑得过而且跑的快。。就是代原创 2018-02-22 21:51:15 · 247 阅读 · 0 评论 -
Jzoj5236 利普希茨
对于一个整数序列A,我们定义f(A)=max{floor(|Ai-Aj|/(j-i))},这里i给出一个长度为n的序列A,有q此操作1.修改一个元素的值2.询问A的一段区间[l,r]组成的序列的f(A[l..r])这里有一个很显然的结论,那就是使得f取到最大的i,j一定满足j=i+1为什么?可以证明一下,以下证明来自jefflyy:函数"用归纳法,若(长度为2⋯原创 2017-11-17 20:11:44 · 605 阅读 · 0 评论 -
Jzoj4895 三部曲
因为外来的入侵,国王决定在某些城市加派士兵。所有城市初始士兵数量为0。当城市 被加派了k名士兵时。城市i的所有子城市需要被加派k+1名士兵。这些子城市的所有子城市需要被加派k+2名士兵。以此类推。当然,加派士兵的同时,国王也需要不断了解当前的情况。于是他随时可能询问以城市i为根的子树中的所有城市共被加派了多少士兵。你现在是国王的军事大臣,你能回答出国王的每个询问么?我们先求出dfs原创 2017-11-03 17:17:12 · 347 阅读 · 0 评论 -
Jzoj4614 字符串(待填)
(EMPTY)原创 2017-10-07 22:32:40 · 329 阅读 · 0 评论 -
Jzoj3901 二叉查找树
题意:给你一个bst插入的顺序问你完成这些操作需要多少次比较(即这颗bst所有节点深度之和)显然,我们在bst中插入一个节点x,它一定是它前继或者后续的儿子这样的话,我们记录每个点的深度,每次找前继和后续即可本来应该用链表的,我还是为了卡时用了ZKW线段树#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include原创 2017-10-03 20:22:09 · 332 阅读 · 0 评论 -
Jzoj3898 树的连通性
题意:给一棵树,每次删边或者询问连通性,强制在线其实这题做法很多嘛,简单说一下一眼看过去肯定是LCT啦,于是马上开始打打到一半发现似乎不用LCT?好像树剖也可以嘛结果发现树剖也不用,直接一个dfs序就可以了嘛用线段树维护每个点能到达的最远的祖先,删边的时候将整个区间覆盖即可注意,对于在子树中已经断开的节点不要再覆盖,可以记录每个节点深度#pragma GCC opi原创 2017-10-03 19:37:42 · 398 阅读 · 0 评论 -
Jzoj3883 线段树
题意:给你一颗树,每次选择一条简单路径进行染色,问最后每条边的颜色此题非常之坑,各种卡,主要是卡栈空间首先看题就写了个树剖,让后各种TLE和RE,开了O3还是不行#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#pragma comment(linker, "/STACK:102400000,102400000") #i原创 2017-10-03 16:58:17 · 286 阅读 · 0 评论 -
Jzoj3882 近邻
有n个无聊的人,对于一条长为m(n我们要知道的是在每个人加入之后整个队伍的友善值。为了更方便确认你能够得到答案,输出每个人加入后整个队伍的友善值的异或和即可。这个题就是要维护一个动态插入和求前继后续的序列,那么我们可以用map但是TLE了,那么就改成好写又好看的zkw线段树即可,当然正解其实是离线处理+链表,不过因为位运算常熟小所以也可以掉打一些跑得慢的#include#原创 2017-10-02 21:27:27 · 318 阅读 · 0 评论 -
Jzoj3928 射♂击
有问题,找副连,无聊的时候当然也可以找他啦。小W找到了他的叔叔——东厂厂长——宇宙超级无敌老WS yy。他们叔侄两个商量之后决定用弹弓打破社区里的一些窗户,但是弹弓每秒只能彻底打破一扇窗户。而且如果某户窗户的主人回来了的话,他们就不能进行破坏了(不然会死得很惨的)。因为有的人装的玻璃好,有的人装的玻璃差,有的人装的玻璃高,有的人装的玻璃矮,所以你不能要求他们叔侄两个打破不同的窗户获得的快乐值必须相原创 2017-10-04 11:40:15 · 276 阅读 · 0 评论 -
Jzoj3547 MEX
有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。这是一个经典的主席树的题目,对于每个节点i开一颗线段树存储[1,i]区间内每个数最后出现的位置,那么查找的时候直接再树上类似平衡树找最小即可#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#in原创 2017-09-27 21:24:00 · 283 阅读 · 1 评论 -
Jzoj2921【NOI2012模拟题】字符串识别
神(shui)题,AC后看了下别人的code发现全都是后缀数组(难看)可能是因为我太弱了所以只想到SAM的算法做法:建立SAM,求出parent树,预处理倍增,让后就可以O(lg n)查询一个字串的出现次数了接下来,我们对于每个l∈[1,n],我们求出一个最小的r使得[l,r]在整个串里面只出现一次那么对于每个点i,ans[i]有两种情况:1.i被一个最短的区间[lj,原创 2017-09-20 20:54:46 · 400 阅读 · 0 评论 -
Jzoj4605 排序
树套树?莫队?分块?好像都可以?我们发现询问只有一个,我们考虑二分这个最后答案我们将序列中所有大于mid的值变成1,否则变成0,那么,排序就变成了将序列的01放在头或尾,可以用线段树区间修改做到#include#include#define mid (l+r>>1)#define ls x#define rs xusing namespace std;int s[400原创 2017-10-07 22:08:35 · 367 阅读 · 0 评论 -
Jzoj4603 颜料大乱斗
看了一眼就开始想分快树套树莫队了吧?233333333但是这道题有一个奇怪的条件!颜色不超过30种!是不是一个状压就完了?23333333333333333333#include#define ls x#define rs x#define mid (l+r>>1)int s[400040],t[400010],n,m,c;void pushdown(int x){ i原创 2017-10-07 21:54:47 · 379 阅读 · 0 评论 -
Jzoj4604 树
子树的问题都是dfs序的工作啦,加上个线段树就ok了#include#define mid (l+r>>1)struct Edge{ int v,nt; } G[200010];int h[100010],cnt=0,clk=0,l[100010],r[100010];int s[400040],n,m,d[100010]; char c[5];void adj(int x,in原创 2017-10-07 22:01:34 · 409 阅读 · 0 评论 -
一些基础算法的模板(持续更新)
更新中//Templates From Extended_Ash/Cooevjnz/JacaJava/Tubbcrafft//To be continued...//Suffix Automationchar str[N]; int s[N][26],mx[N],f[N],sz[N]; int last=1,cnt=1,n,v[N],r[N],ans=0; inlin原创 2017-10-25 22:05:58 · 3734 阅读 · 0 评论 -
Jzoj4727 挺进
题意:给你一颗树,要求断掉一条边,使得剩下两个联通快的直径之和最大一看就是树形DP嘛,c1表示最长边c2次长,f表示父亲部分的最长路上面做法不讲,我们讲一种比较新奇的方法假设我们枚举断哪一条边,在lgn时间内求出两个联通快的直径不就行了嘛怎么做呢,我们发现,可以用树的dfs序来维护,我们用一个线段树维护一个区间内的直径的端点和长度额,如何合并?我们假设两块的直径端点分别为x原创 2017-10-17 20:23:56 · 635 阅读 · 0 评论 -
Jzoj4877 力场护盾(红警系列)
ZMiG成功粉碎了707的基因突变计划,为了人类的安全,他决定向707的科学实验室发起进攻!707并没有想到有人敢攻击她的实验室,一时间不知所措,决定牺牲电力来换取自己实验室的平安。 在实验室周围瞬间产生了一个无限大的力场护盾,它看上去无懈可击!不过ZMiG拥有惊人的双向观察能力,经过他的反复观察,找到了这个护盾的N个弱点,他本想逐一击破,却发现一股神秘力量阻止了他的行为。原来他身处力场原创 2017-10-31 16:28:49 · 1035 阅读 · 0 评论 -
Jzoj5462【NOIP2017提高A组冲刺11.8】证书
Pulumi生活在P城的角落,而他的朋友们gjdy,oyski,tutuwai等等生活在P城的靠中心位置。P城很大,但它拥有优秀的城市结构,同时P城重视文化教育的发展,P城共有n个学校,校与校之间共建立了n-1条交通线路,且两所学校之间存在唯一的连通路径。P城常常举行各种类型的评比活动,为了节约资金,最终将给某一条路径上的所有学校颁发证书。为了便于描述我们记一次评比活动的结果为(ui,vi原创 2017-11-08 15:56:42 · 961 阅读 · 0 评论 -
Jzoj4846 行走
这个题一看就是树剖的模型但是有一些问题,比如权值的乘机太大了,可能会爆long long一种解决的方法:我们考虑到,v对于权值为1的边我们可以用一个并查集合并(注意只会改小)但是这种方法不好想,我们还是考虑树剖若权值>=10^18 我们可以直接将其变为一个特殊的值(例如-1)表示“足够大”,这种情况直接输出0若不够,我们有一个结论: [[a/b]/c] = [a/bc] 这原创 2017-10-30 22:05:52 · 324 阅读 · 0 评论 -
Jzoj4845 寻找
“我有个愿望,我希望穿越一切找到你。”这是个二维平面世界,平面上有n个特殊的果实,我从(0,0)点出发,希望得到尽量多的果实,但是出于某种特殊的原因,我的运动方式只有三种(假设当前我在(x,y)):1、我可以走到(x+1,y)2、我可以走到(x,y+1)3、我可以走到(x+1,y+1)现在我需要你的帮助,帮我找出我最多能够得到多少个果实。经典的二维dp,我们设f原创 2017-10-30 22:00:23 · 296 阅读 · 0 评论 -
Bzoj3196 二逼平衡树
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查询k在区间内的后继(后继定义为大于x,且最小的数)额,这个题,看了一眼就知道是线段树套线段树啦,所以随手糊一发#pragma GCC opitmize原创 2017-10-15 16:01:59 · 323 阅读 · 1 评论