线段树
Mys_C_K
人生有许多道:曾经踏足的是道,即将踏往的也是道,那什么才是道呢?唯有脚下走的才是道。一切精神或者物质都归于虚无,然后从混沌中衍生出三万道。在悲喜间涉足一条无数前人经历过,且将有无数后人奔赴的道,无论是否已经或者将要到达彼岸,然后便不再回头或是左顾右盼,即使有些道繁盛至极,夜灯如昼,无数人一浪又一浪的涌去,造就了世人皆知的辉煌;即使有些道草木凋敝,荒草丛生,只等勇敢的开拓者斩开荆棘,创造一片天地;这些都无所关,无所在意,彼岸何如、来日何方甚至过往旧事都化作一缕云烟,飘渺碧霄,我自撷高山之月色,独随足落处往行。
展开
-
重复子串(string) - SAM - 启发式合并 - 线段树
题目大意:给一个字符串多次询问一个子串s的权值。一个字符串的权值定义为最长的出现了至少两次的子串的长度。n,m≤105n,m\le10^5n,m≤105。题解:考虑把串反过来,建SAM。显然询问要先二分一波。那就是求对应下标在某个区间内的点是否存在两个点其LCA的val大于等于二分的值。考虑哪些点对有可能成为答案,显然如果有三个前缀下标a,b,c满足a<b<c(设ps(a)表示前...原创 2019-04-16 16:33:39 · 440 阅读 · 0 评论 -
[HNOI2017] bzoj 4826 影魔 - 线段树 - 扫描线 - 单调栈
题目大意:给一个排列p,多次询问一个区间[l,r]的中有多少子区间[i,j]满足:mx(i+1,j−1)≤min(p[i],p[j])mx(i+1,j-1)\le min(p[i],p[j])mx(i+1,j−1)≤min(p[i],p[j])(记做cnt1),或者min(p[i],p[j])&lt;mx(i+1,j−1)&lt;max(p[i],p[j])min(p[i],p[...原创 2018-10-25 14:42:33 · 280 阅读 · 0 评论 -
AGC 019 C - 贪心 - 线段树
题目大意:网个图边长100,有些格点有半径为10的圆盘。只能沿着边和圆盘边界走,不能进入圆盘。问一个点到另一个点的最短路。网格图大小1e8,圆盘个数1e5。不存在两个圆盘在同一条横线或者竖线上。题解:圆盘看上去只会绕远路,其实不然,如果想要从(x,y)走到(x+1,y+1)并且(x+1,y)处有一个圆盘的话,那么就可以通过那个圆盘节省2R-0.5PI*R的路程。然后除了一些边界情况(起点到终点内...原创 2018-10-25 14:31:28 · 245 阅读 · 0 评论 -
选举 - 线段树 -单调队列 - dp
题目大意:给定序列a,满足ai∈{−1,0,1}a_i\in\{-1,0,1\}ai∈{−1,0,1};定义w(l,r)=sgn(∑i=lrai)w(l,r)=sgn(\sum_{i=l}^r a_i)w(l,r)=sgn(∑i=lrai),其中sgn为符号函数。将a划分成若干长度在[l,r]之间的段,使得每一段的权值之和最大。n≤106n\le10^6n≤106题解:写了个nlgn得...原创 2018-10-10 16:16:14 · 155 阅读 · 0 评论 -
bzoj 4695 最假女选手 - segment tree beats
题解:维护区间最大值mx、最大值出现次数mxcnt、严格次大值semx、最小值mn、最小值出现次数mncnt、严格次小值semn、区间和s、区间加法标记pt、区间最大值相对于其余数字的加法标记mxpt、区间最小值相对于其余数字的加法标记mnpt,一些细节形如:进行朴加法的时候mxpt和mnpt不变;先下传区间加法标记;下传两个最值的标记的时候需要传到最值来源的子树;更新区间最值时,如果发现需要递...原创 2018-10-08 15:51:49 · 309 阅读 · 0 评论 -
不重复区间 - 线段树
给一个数列,每次修改一个数字或者问有多少区间内没有相同的数字的区间。n,m≤105n,m\le10^5n,m≤105题解:首先固定r,相当于l不断变小同时pre的max变大,一直到要max(pre)>=l为止。考虑类似线段树维护单调栈的做。每次一个区间的答案等于左区间的答案加上,从右区间开始往左走并考虑左区间对右区间的影响。考虑在线段树上二分出右区间最长的一个前缀,满足这个前缀的m...原创 2018-09-28 16:41:37 · 396 阅读 · 0 评论 -
【清华集训2014】uoj #38 奇数国 - 线段树
直接维护个二进制数即可。#include<bits/stdc++.h>#define rep(i,a,b) for(int i=a;i<=b;i++)#define Rep(i,v) rep(i,0,(int)v.size()-1)#define mp make_pair#define fir first#define sec second#define pb pu...原创 2018-10-02 16:01:54 · 365 阅读 · 0 评论 -
AGC011 F Train Service Planning - 线段树
不算神仙的神仙题 网上题解写的很清楚了 (lhx必须%)#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<vector>#include<climits>#define N 100010#def...原创 2018-09-14 16:56:18 · 224 阅读 · 0 评论 -
ARC 063 F - 分治 - 线段树 -单调栈
题目大意:给出一个wxh的网格图,和n个点,求一个周长最大的矩形,满足这个矩形内部没有点。注意矩形边界上不算在内部。 n<=2e5 。题解:考虑分治,现在要计算跨越中线的情况,那么维护上下两个单调栈,退栈的时候用线段树维护一下即可。边界情况比较多需要注意,直接做的复杂度是O(nlg2n)O(n\lg^2n)O(nlg2n)的,但是注意到答案至少是2(max(w,h)+1)2(\max(...原创 2018-09-18 10:50:23 · 297 阅读 · 0 评论 -
踩气球 - 线段树
题目大意:给你n个数Ai和m个区间,每次让某个Ax–,然后询问有多少个区间的和是0。任意时刻Ai>=0。强制在线。 题解:直接线段树把区间拆开即可。#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<vector>...原创 2018-09-08 14:03:24 · 382 阅读 · 0 评论 -
动物园 - 树剖 - 主席树
给你一棵树,支持链加,和给定一条路径x-y,假设从y走到x的权值序列是{a},求 ∑iaii2−∑iaii2∑iaii2−∑iaii2\frac{\sum_{i}a_ii^2-\sum_{i}a_ii}2,还有返回到之前某个版本。 题解:直接树剖然后可持久化掉线段树即可,维护区间∑iikai,k≤2∑iikai,k≤2\sum_{i}i^ka_i,k\le2即可。#include<i...原创 2018-08-24 21:23:14 · 225 阅读 · 0 评论 -
[POI2015]bzoj 4383 Pustynia - 线段树优化建图
每次建一个辅助点然后线段树优化建图即可,注意特判a[i]≤109a[i]≤109a[i]\le10^9.#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<queue>#define gc getchar()#de...原创 2018-08-24 18:27:35 · 194 阅读 · 0 评论 -
ARC 073 F Many Moves - 线段树 - dp
题目大意:有一条数轴,两个人初始在a,b。每次给个x,你要让其中恰好一个人移动到这个x,代价是距离。求最小代价之和。题解:场上一直在想贪心还过了样例……冷静一下考虑一个朴素dp,设f[i][j]f[i][j]f[i][j]表示前i次询问,另一个人在x_j的情况。那么发现这么一件事情:如果j̸=i−1j\not=i-1j̸=i−1,那么总是让一个人从i-1走到i的。所以这个状态直接由f[...原创 2018-10-21 20:04:00 · 257 阅读 · 0 评论 -
NOIP2018 Day2 T3 保卫王国 - 动态dp - 树剖 - 线段树
直接裸上动态dp即可,因为某些不知道的原因NOIP能过,别的地方不开O2都过不了。upd:2018/11/27:现在luogu上不开O2也能过了,只要为每条重链单独开线段树就可以了(代码附后)。原创 2018-11-20 18:23:48 · 606 阅读 · 0 评论 -
取石子 - 线段树
题目大意:有两个人,一开始分别有x和y个石子。两个人轮流操作n轮,第i轮从对面那里拿来a_i个石子,若不足则全拿。m次修改x或y或a_i然后问最后第一个人手上有几个石子。n,m≤5×105n,m\le5\times10^5n,m≤5×105题解:显然就是每次x加或者减一个数字对s取min对0取max。考虑分治,设solve(L,R,x)表示做完L,R的操作,x会变成多少。首先考虑(mid,...原创 2019-04-16 16:20:22 · 470 阅读 · 0 评论 -
Duck - 线段树优化建图 - 强连通分量
题目大意:给定n个区间[li,ri],求一个排列p,元素x若满足至少有一个[lx,rx]中的元素y严格在x前面,就会获得vx的收益。问最大收益。n<=2e5.题解:考虑x向[lx,rx]连边,那么对于不同的强连通分量,总是能做到排在前面的强连通分量内的点全部获得收益;没有出边的强连通分量总是至少存在一个点没有办法获得收益,钦定是那个最小的点即可。线段树优化建图一下。#include<...原创 2019-04-03 07:29:30 · 230 阅读 · 0 评论 -
[集训队作业2018]uoj 431 time map - 线段树
题目大意:给一个广义线段树(即分治中心是输入的),支持对一个节点代表的区间做区间与、或、异或一个数,以及询问从一个点向下走经过的点的权值和,一个点的权值定义为其所对应区间的区间与,向左还是向右走取决于该点权值中1的个数(即bitcount)。题解:考虑从一个点向下走,权值发生变化只会有log次。先说一下某个std的做法:对这个广义线段树树剖,然后重链每个点维护其轻儿子的权值,链底维护自己的权...原创 2019-03-03 12:43:18 · 773 阅读 · 0 评论 -
[集训队作业2018]UOJ 430 line - dp - 线段树 - 斜率优化 - CDQ分治
发现以前学习的斜率优化全是假的。学习到了新的斜率优化,比原先的那个更方便一些。形如Yi=Yi′+minj∈[1,i){KjXi+Bj}Y_i=Y&#x27;_i+\min_{j\in[1,i)}\{K_jX_i+B_j\}Yi=Yi′+minj∈[1,i){KjXi+Bj}的dp,其中YYY是要计算的dp,Y′,XY&#x27;,XY′,X都是已知量,K,BK,B...原创 2019-02-26 21:33:26 · 543 阅读 · 0 评论 -
[集训队作业2018]UOJ 423 万圣节的积木 - 李超线段树
题解:(假设最底层的是1)不难发现每次把某个j+1…ij+1\dots ij+1…i放上去,必须要有1…i1\dots i1…i是合法的,那么∀j∈[1,i],j…i\forall j\in[1,i],j\dots i∀j∈[1,i],j…i都是合法的。然后一坨木板的加权重心是∑iximi∑imi\frac{\sum_{i}x_im_i}{\sum_{i}m_i}∑imi∑iximi...原创 2019-02-26 11:30:42 · 531 阅读 · 0 评论 -
专家系统 - 二分 - 线段树
题目大意:现在有n个坐标(xi, yi),你要从中选出k个。假设你选出的全部k个坐标中,x坐标最小值为xmin,x坐标最大值为xmax,y坐标最小值为ymin,y坐标最大值为ymax。那么你得出的不确定度c=max(xmax-xmin, ymax-ymin)。你的目的是让c尽可能小。由于可能有很多种选法能够达成这一目的,你只需要输出这个最小的c即可。题解:二分答案,枚举上边界,每次加入删除,然...原创 2018-12-31 16:23:03 · 323 阅读 · 0 评论 -
青春野狼不做姐控偶像的梦 - 线段树 - 扫描线 - 单调栈
题目大意:给你一个排列,多次询问,每次给你一个区间,问有多少子区间,数字取出来sort一遍是连续的一段。题解:考虑l=1,r=n咋做。考虑一段合法,当且仅当max-min=r-l。那么用个单调栈预处理每个数字在哪些[l,r]会成为最大/最小值,然后扫描线维护max-min+l的最小值,显然由于[r,r]是答案所以能取到最小值的位置都一定是答案。考虑整个问题,就是每次在所有最小值的位置+1...原创 2018-12-25 18:19:02 · 355 阅读 · 0 评论 -
alpha - 分治NTT - 线段树
题目大意:有[1,1e9]的数轴,n次操作每次给一个区间[Li,Ri]的数有pi的概率+1,1-pi的概率不变。问最后等于k的数字期望有多少个。n≤5×104n\le5\times10^4n≤5×104题解:问题等价于区间乘以一个一次式,最后对每个位置求k次项系数。离散化后线段树,等价于每次从根到叶节点的式子乘起来在乘个叶节点对应的区间长度取k次项系数求和。但这么做复杂度是错的,考虑反过来...原创 2018-12-12 09:55:03 · 360 阅读 · 0 评论 -
序列操作 - 线段树
题目大意:你要维护一个长度为n的序列,进行操作。对于这个序列,233之类的数不能出现,也就是说233,2333,23333,233333……这一系列的数不能在序列中出现。1 i 输出第i个元素。2 a b x 将[a,b]区间的序列赋值为x。3 a b x 将[a,b]区间的序列加上x。4 a b 将区间[a,b]赋值为[a,b]中的最大值。5 a b 将区间[a,b]赋值为[a,b...原创 2018-11-22 10:48:59 · 402 阅读 · 0 评论 -
摧毁图状树 - 线段树 - 倍增
题目大意:给你一棵无权树,对于每个k=1…n求:每次你可以给一个点x到其k级祖先的路径上的所有点打上删除标记。问最少多少次可以把所有点打上删除标记。n≤105n\le10^5n≤105题解:考虑k怎么做,显然先把叶子涂黑,然后每次涂黑一个点,就把其k级组先拿出来,放进堆里。每次选择堆中深度最大的一个点,若其未被涂黑,则涂黑,并重复上述操作。于是可以注意到答案是O(x+(n-x)/k)级别...原创 2018-11-19 09:55:39 · 432 阅读 · 0 评论 -
CERC 2014 B Mountainous landscape - 线段树 - 凸包 - 三分
题目大意:给你平面上n个横坐标严格递增的点,对于每个i∈[1,n)i∈[1,n)i\in[1,n),求一个jjj,满足PjPjP_j严格在直线PiPi+1PiPi+1P_iP_{i+1}上方。点坐标10910910^9,有10510510^5个点。 题解:答案可能不在凸包上,但如果凸包上都没有解那么就不可能有解。因此可以判断是否有解,扩展下去,可以先二分答案,然后看区间凸包是否有解;区间可以用线...原创 2018-08-28 21:39:00 · 317 阅读 · 0 评论 -
[学习笔记] Mys_C_K的独立集好题 - 动态dp - 树剖 - 线段树
注意修改的时候要先从上到下减去,然后修改好后从下到上加上。 注意轻边的信息是真的dp值,特判空信息。#include&lt;iostream&gt;#include&lt;cstring&gt;#include&lt;cstdio&gt;#include&lt;algorithm&gt;#define lint int#define gc getch原创 2018-08-21 12:41:08 · 239 阅读 · 0 评论 -
bzoj 4712 洪水 - 动态dp - 树剖 - 线段树 - 矩阵乘法
动态dp入门题,转移有结合律可以写成矩阵的形式,特判叶子。#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<climits>#define gc getchar()#define lint long long#de...原创 2018-08-21 12:37:29 · 326 阅读 · 0 评论 -
codeforces 331 D3.Escaping on Beaveractor - 线段树 - 基环树 - 倍增
传送门 题目大意:平面上有有些有向线段,平行于轴,当走到有向线段的时候自己的方向就要变成其方向,自己速度1。给定这些有向线段,多组数据,每组给出初始位置和初始方向和时间,问是否会走出边界,如果不,输出最后在哪里,否则输出离开边界时候的坐标。数据都是1e5,时间1e15。 题解:题目本身很简单,把所有东西离线下来,用线段树处理出从询问点或者某个有向线段的箭头处开始走会走到哪一个点方向发生转折,以原创 2018-02-03 21:53:13 · 492 阅读 · 0 评论 -
Codeforces 893F Subtree Minimum Query(Hard) 主席树
题目大意:给定一棵有根树,点x有点权a[x],多组询问,每次询问以x为根的子树中的所有满足dep[y]-dep[xi]<=ki的y中,最小的a[y]。n<=1e5, q<=1e6。强制在线。 题解:按照dfs序重新编号,这个题等价于求编号在[L[x],R[x]],深度在[dep[x],dep[x]+k]中的点权最小值。 因此就是一个二维数点(权最值)。但是随意一个矩形的最值类询问还要树套树什么的原创 2017-12-26 19:55:11 · 579 阅读 · 0 评论 -
Monkeying Around 线段树+树状数组
题目大意,给定若干(Li, Ri, Ki)表示Li到Ri的人都得到一个标号为ki的球,依次进行。n个人每个人有一个状态0或者1,如果在这次操作前已经有过ki这种球了,那么状态会变成0,否则变成1.初始的时候都是0.求m次操作后有多少个0. 题解:一开始想错了,后来发现是个傻逼提。唯一需要考虑的性质是,每个人的最终状态 基 本 上 由最后一次覆盖到他的操作的ki决定。(题面是经过一点点转化的,原创 2017-12-25 21:11:41 · 418 阅读 · 0 评论 -
51Nod 1672 扫描线 + 线段树/树状数组
题目大意,给定n个数字和m个区间,和k≤\leqm,从m个区间中选出恰好k个,使得他们的交的和最大,数字都是正数,n,m,k<=1e5。 题解:首先不难发现这个题没法直接做,STL上了个错的思想,即每个区间都+1然后对于被覆盖了k+次的区间做最大字段和,显然是错的。 考虑枚举答案的右端点,显然左端点越远越不可能是答案,而左端点越远效果越好。并且注意到一个区间是覆盖[l,r]当且仅当这个区间既覆盖原创 2017-12-25 21:03:24 · 374 阅读 · 0 评论 -
vijos 1471 教主的游乐场 - 线段树优化dp
传送门题解:首先这个题可以n遍bfs。然后发现dp只记录一维状态不够,因为可能有环,不满足dp性质。解决方案有如下两种:1.于是找性质,发现非常有意思的一点是每个点可以向前跳到任何一个点。考虑一条最优解路径,如果先向右跳了一步,然后又向左跳了一步,那么不如直接向右/左跳一步。也就是最优解至多在第一次跳是向左的。因此可以先处理一个点只往右跳的答案,这个显然可以用线段树维护原创 2017-08-04 19:53:05 · 573 阅读 · 1 评论 -
[学习笔记][HEOI2013]BZOJ3165 Segment - 超哥线段树
传送门题解:超哥线段树先考虑直线L。首先,假设当前线段树上区间的直线是L2,如果L完全在L2的上面或者L2完全在L的上面那么把其中一个舍弃,递归结束。否则求一下两直线交点。为了方便起见,把左端点比较小的记作L1,另一条记作L2。求一下两条直线的交点。如果它小于等于mid,说明L1在右面的区间上完全覆盖了L2,因此当前区间保存L1,把L2下传到左区间。否则要把L1下放到右原创 2017-08-02 20:27:46 · 832 阅读 · 0 评论 -
HDU4008 Parent and son - dfs序/bfs序 - 线段树
传送门题解:换根操作是老套路,这个有一问是求儿子中的信息,要用bfs序来维护;要注意的是要求儿子的bfs序和本身并不是连续的。代码:#include#include#include#include#include#define MAXN 100010#define MAXM 200010#define MAXL 20#define INF (MAXN-2)#def原创 2017-07-22 10:35:28 · 729 阅读 · 0 评论 -
[POI2015] BZOJ 3747 看电影
传送门题解:有点类似于扫描线的思想还是第一次见,感觉非常秒。考虑移动左端点,欲通过一些奇技淫巧计算最优右端点。首先左端点在1。考虑对于某一种电影,这种电影的第一次出现的位置记为h,下一个记为nxt[h]。(用nxt数组维护每个点下一个和它类型相同的电影的下标。如果没有则是n+1)那么右端点在[h,nxt[h]-1]的时候会得到这部电影的好看值。这是一个区间加操作。把所有的第一次原创 2017-07-15 17:43:26 · 623 阅读 · 0 评论 -
HDU5770 Treasure - LCA - 扫描线 - 线段树
传送门题目大意:……给定一棵树,有若干三元组(u,v,w)表示有一个宝箱在v,其唯一对应的钥匙在v,且宝箱价值是w(可能为负)。让你选一条简单路径(有向),每到一个点要求必须先拿起钥匙(如果有的话),然后必须打开宝箱(如果有宝箱并且手上已经有钥匙了),最大化价值之和。题解:思路过程如下:直接统计每条路径的价值没有办法。显然一条路径由起点和终点唯一决定,下文记为(s,t)。我们可以考原创 2017-07-15 17:02:14 · 494 阅读 · 0 评论 -
2017年三轮省队一个题的感想
题目大意:给定一列n思路:妙哉我把题面给的暴力写错了好先看部分分数据随机?好像一列数是递增的那么他们之间的相对顺序不会变,因此可以缩成一个点,每次把一个点中的最大值加入到下一个点当中。一个优化是当当前点的最大值<下一个点的最小值的时候就把这两个点合并成一个。好我就很开心的写了不是很多人会的左偏树开森然后发现并没有必要用堆这个性质直接用链表套数组随便xjb搞一搞就原创 2017-07-02 12:59:48 · 383 阅读 · 0 评论 -
Educational Codeforces Round 23 A-F
感觉这种比赛就是拼手速啊QwQA.Treasure Hunt题目大意:平面直角坐标系中给定起点和终点,每次可以从(a,b)走向(a+x,b+y),(a-x,b-y),(a+x,b-y),(a-x,b+y)这四个点。问从起点能否到达终点。要求O(1)做法。题解:这个第一遍提交还WA了QwQ。首先如果这个是在一维直线上的,那么只要判断|x1-x2|是不是x的倍数即可。在二维原创 2017-06-16 11:32:16 · 568 阅读 · 0 评论 -
codeforces 100792B Banana Brain's Bracelet Z-Box算法 - 线段树
传送门 题目大意:给一个循环串A,和一个字符串C,从A中截下一段B,并将B首尾相接成一个循环串使得C是B的一段。求使|B|最大。 题解:首先把A翻倍拼接得到S,前面放C,求一遍Z-Box,然后把S和C翻过来再求一遍,分别得到z1和z2。然后有两种情况,要么C是S的子串,输出|A|,要么C=C1+C2,然后S中出现了C2,隔了一段出现了C1,即C2….C1,需要满足总长度=|C|-z1[i]。这原创 2018-02-04 20:02:44 · 385 阅读 · 0 评论 -
bzoj 4372 烁烁的游戏 - 点分治 - 线段树
动态点分治裸题#include<iostream>#include<cstring>#include<cstdio>#include<map>#include<algorithm>#define N 100010#define debug(x) cerr<<#x<<"="&a原创 2018-04-17 18:46:16 · 240 阅读 · 0 评论