线段树
DZYO
Never stop
展开
-
bzoj 2733: [HNOI2012]永无乡(线段树合并)
Description永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛。如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的。现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥原创 2017-03-23 16:50:54 · 331 阅读 · 0 评论 -
BZOJ4540: [Hnoi2016]序列 (线段树)
传送门题解: 这道题的线段树做法好神啊。。考虑直接从111扫描到nnn,不断更新1~i1~i1\text{~}i到iii的最小值。那么显然我们要对线段树支持区间覆盖, 区间求历史和。然后我们可以构造矩阵来完成,对于每个节点构造⎛⎝⎜⎜svallen⎞⎠⎟⎟(svallen)\begin{pmatrix} s \\ val\\ len \end{pmatrix} 即可完成区间覆盖...原创 2018-03-04 10:20:05 · 380 阅读 · 0 评论 -
BJ模拟:String(SAM+LCT+主席树)
传送门题意: 给字符串SSS,支持: 1.末尾加入字符。 2.查询[l,r][l,r][l,r]中出现两次的最长字符串。题解: 好题。考虑离线做法: 动态插入后面的字符,更新前面lll的答案。当我们插入一个字符rrr的时候,与前面的公共子串为它的后缀。 我们考虑暴力跳failfailfail链来更新答案: 每个位置记last表示endpos的最后一个位置,那么这个位置能...原创 2018-04-11 11:56:56 · 400 阅读 · 0 评论 -
BJ模拟:巡游计划(线段树分治+动态凸包 / 李超线段树)
传送门题意: fi=minj=i−ki−1{fj+aj+|pi−pj|∗bj}fi=minj=i−ki−1{fj+aj+|pi−pj|∗bj}f_i = \min_{j=i-k}^{i-1} \{f_j+a_j+|p_i-p_j|*b_j\}求fnfnf_n。题解: 对于kkk的限制,采用线段树分治来解决: 把每个点影响的区间放到线段树上,查询的区间也放到线段树上,保证处理这个区...原创 2018-04-12 23:02:49 · 386 阅读 · 0 评论 -
BZOJ5250 / LOJ#2473. 「九省联考 2018」秘密袭击(线段树合并+拉格朗日插值)
传送门题解: 一个显然的做法是枚举每个点计算贡献,把大于他的记为1,小于他的记为0,问题就转化为树上联通块大小等于k的个数。稍微转化一下,我们统计树上联通块第kkk大大等于iii的个数,不妨记为aiaia_i,那么:ans=∑i=1Wi(ai−ai+1)ans=∑i=1Wi(ai−ai+1)ans = \sum_{i=1}^W i(a_i-a_{i+1})我们发现,其实ans=∑i=...原创 2018-04-13 09:45:32 · 642 阅读 · 0 评论 -
BZOJ4785: [Zjoi2017]树状数组(树套树)
传送门题解: 相当于询问你al−1al−1a_{l-1}和arara_r相同的几率(注意特判l=1l=1l=1的情况)。记他们相等的几率为p0p0p_0,不等的几率为p1p1p_1,考虑一个询问对这个几率的影响: 1.只包含l−1l−1l-1或者rrr。 此时有1len1len\frac{1}{len}的几率p0,p1p0,p1p_0,p_1互换。 2.同时包含l−1,rl−1,r...原创 2018-05-06 21:05:46 · 252 阅读 · 0 评论 -
Codeforces 944 G : Coins Exhibition (线段树)
传送门题解: 好题。 原来的区间把kkk分为O(n+m)O(n+m)O(n+m)段,我们只用关心这些段是否全为0/1,还是两种都有。 我们枚举当前段,当前一段为两种都有的情况时一定合法,如果全选0/1可能会不合法。 这时候我们只用关心这段最长的延伸距离,于是我们用线段树来维护fi,gifi,gif_i,g_i表示iii开始之后全为0/10/10/1的方案数。 转移的时候把不合法的全部置为...原创 2018-05-22 09:44:53 · 367 阅读 · 0 评论 -
hihocoder 1193 : 树堆(线段树合并)
传送门题解: 维护一个fifif_i表示父亲节点为iii的最大值,然后每个子树都有一个DP数组。发现每次操作是单点查询或者区间加减。 用线段树合并即可。#include <bits/stdc++.h>using namespace std;const int RLEN=1<<18|1;inline char nc() { static ch...原创 2018-07-11 21:09:23 · 393 阅读 · 0 评论 -
BZOJ4977: [Lydsy1708月赛]跳伞求生(线段树)
传送门题解:只能说出题人的脑洞是真的大。。把aaa和bbb一起排序,合法的序列是一个括号序列,我们贪心的维护这个括号序列的合法性即可。 可用线段树优化至O(nlogn)O(n \log n)O(nlogn)。#include &lt;bits/stdc++.h&gt;using namespace std;typedef long long LL;typedef pair &lt;...原创 2018-09-18 15:31:57 · 310 阅读 · 0 评论 -
Codechef:The Street/STREETTA
传送门题解:第一个操作用李超树维护一下就行了。 时间复杂度O(mlog2n)O(m \log^2 n)O(mlog2n)。#include &lt;bits/stdc++.h&gt;using namespace std;typedef long long LL;const int RLEN=1&lt;&lt;18|1;inline char nc() { static cha...原创 2018-10-12 09:52:48 · 244 阅读 · 0 评论 -
Codechef:Count on a Treap(线段树)
传送门题解:Treap的中序遍历是按照键值来排序后的序列,两点的lca为这个序列上区间权值的最小值。现在只用考虑怎么求深度:显然往前的一个权值比他大的会成为他的父亲,或者他们中间夹了一个更大的成为他的父亲。 其实就是求上升序列,然后套用常见套路即可。#include <bits/stdc++.h>using namespace std;typedef pair <i...原创 2018-10-12 11:19:45 · 349 阅读 · 0 评论 -
LOJ#2553. 「CTSC2018」暴力写挂(边分治+线段树合并)
传送门题解:按照套路,变成求d1(x,y)+dx+dy−2∗d′lca′(x,y)d_1(x,y)+d_x+d_y-2*d&amp;amp;#x27;lca&amp;amp;#x27;(x,y)d1(x,y)+dx+dy−2∗d′lca′(x,y)然后出个二。在第二棵树里面做,相当于支持一下不同子树内部点距离的最大值。可以边分治,然后就跟线段树结构一样了,合并成了O(nlogn)O(n \log ...原创 2018-10-05 14:57:29 · 711 阅读 · 0 评论 -
UOJ#397. 【NOI2018】情报中心(线段树合并+虚树)
传送门题解:WC,CTSC二合一真TM爽。两种路径的最大值分开求:1.lca不同,此时枚举相交的链中较下面的点,然后贡献可以线段树合并。2.lca相同,此时可以建虚树,然后变成和CTSC一样的问题。时间复杂度O(nlogn)O(n \log n)O(nlogn)。#include <bits/stdc++.h>using namespace std;typedef ...原创 2018-10-08 22:18:24 · 612 阅读 · 0 评论 -
Codechef :Rectangle Query/QRECT (容斥+树套树)
传送门题解:CDQ分治什么不存在的。直接找不相交的,然后分八种情况维护一下即可。#include &lt;bits/stdc++.h&gt;using namespace std;const int RLEN=1&lt;&lt;18|1;inline char nc() { static char ibuf[RLEN],*ib,*ob; (ib==ob) &amp;&amp原创 2018-10-10 19:58:40 · 244 阅读 · 0 评论 -
UOJ#418. 【集训队作业2018】三角形(线段树合并)
传送门题解:加入一个数,相当于是先加上Ai=wiA_i=w_iAi=wi,再减去Bi=∑j∈soniwjB_i = \sum_{j \in son_i} w_jBi=∑j∈soniwj,然后代价就是一个操作序列的前缀最大值。先考虑一下没有限制的的时候,怎么使得这个前缀最大值最小,我们可以分为两个部分:Ai−Bi&amp;lt;0,Ai−Bi≥0A_i - B_i \lt 0,A...原创 2018-11-05 22:45:22 · 972 阅读 · 0 评论 -
Educational Codeforces Round 38 G:Shortest Path Queries(线段树+并查集)
传送门题解: x→yx→yx\rightarrow y的所有路径都可以由x→yx→yx\rightarrow y在dfsdfsdfs树上的路径抑或图中的环得到。然后问题变为了动态维护dfsdfsdfs树和所有环(支持删边加边),这个显然是不大可做的,不过如果只有加边操作就很简单了。然后发现可以离线,就可以把一条边的出现区间放到lognlogn\log n个线段树的节点上,然后从上往...原创 2018-02-22 16:13:19 · 316 阅读 · 0 评论 -
BZOJ4538: [Hnoi2016]网络(树上路径交+整体二分)
传送门题解: 对于一个询问我们二分他的答案kkk,那么只用判断所有大于kkk的路径的交集是否包含即可。可以考虑整体二分,直接把路径一起往线段树上放,询问直接在线段树上二分就行了。维护树上路径交可以做到 O(1)O(1)O(1) ,具体可以看这里。 也可以直接用树状数组做路径加然后查询标记数, 不过时间复杂度会多一个lognlogn\log n。用STSTST表维护LCALC...原创 2018-02-28 16:09:39 · 609 阅读 · 0 评论 -
序列操作 IV(树套树)
Description 给出序列 a1,a2,…,an(0≤ai≤109),有关序列的两种操作。ai(1≤i≤n)变成 x(0≤x≤109)。求 al,al+1,…,ar(1≤l≤r≤n)第 k(1≤k≤r-l+1)小。题解 很显然,查询待修改的区间第k大一般的数据结构已经无法实现。这里给出树套树实现查询的数据结构。 线段树+权值线段树对于每个线段树上的点维护一颗权值线段树树保存该区间所原创 2017-07-12 11:17:33 · 363 阅读 · 0 评论 -
序列操作(线段树)
DescriptionLxhgww 最近收到了一个 01 序列,序列里面包含了 n(1≤n≤105)个数,这些书要么是 0,要么是 1,现在对这个序列有五种变换操作和询问操作:0 a b ,把[a,b]区间内所有数全部变成 0。 1 a b ,把[a,b]区间内所有数全部变成 1。 2 a b ,把[a,b]区间内所有数全部取反,也就是说把所有的 0 变成 1,把所有的 1 变成 0。原创 2017-07-04 19:42:45 · 555 阅读 · 0 评论 -
BZOJ3065: 带插入区间K小值(替罪羊树+权值线段树)
传送门题意: 带插入区间K小值题解: 替罪羊树+权值线段树,替罪羊的每一个节点维护子树的权值线段树,暴力重建即可。 每次插入复杂度O(log2n)O(\log^2n),查询O(log2n)O(\log^2n)#include<bits/stdc++.h>using namespace std;struct IO{ streambuf *ib,*ob; inline voi原创 2017-09-30 07:44:44 · 460 阅读 · 0 评论 -
BZOJ3995:道路修建(线段树维护MST)
传送门题意: 给一张2×n的网格图,只有相邻的点连了边,支持询问区间的最小生成树,以及修改边权。题解:线段树。 %%%PoPoQQQ : http://blog.csdn.net/popoqqq/article/details/45080183#include<bits/stdc++.h>using namespace std;struct IO{ streambuf *ib,*ob原创 2017-10-01 23:08:14 · 414 阅读 · 0 评论 -
BZOJ3073:Journeys(线段树)
传送门 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路。N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路。Seter保证一条道路不会修建两次,也保证不会有一个国家与自己之间有道路。 Sete原创 2017-11-08 08:54:38 · 322 阅读 · 0 评论 -
BZOJ4530: [Bjoi2014]大融合(LCT维护子树,线段树合并)
传送门题意: 给一个动态树,维护sze集合大小。题解: 动态树。这里贴出一份LCT维护子树和的方法(不支持修改): 对于一个点x,如果我们对x进行access操作,那么他的虚子树内将包含且仅包含他原树中子树内除了他自己以外的所有点,这时如果我们维护了他的虚子树信息和,我们把这个信息与他自己的信息合并,我们就得到了他在原树中的子树信息。 考虑一个点的虚子树信息会在什么情况下发生改变,原创 2017-08-18 14:03:59 · 470 阅读 · 0 评论 -
BZOJ3165: [Heoi2013]Segment(线段树)
传送门 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段。记第i条被插入的线段的标号为i。 2.给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号。 题解: 好题啊。。可以假设目前每个区间只有一条线段覆盖(初始化为0),考虑新加入一条边的影响: 如果这条边在原边之上或者之下,那么直接保留较上面的边就行了。如果有交点,原创 2017-11-25 11:06:53 · 392 阅读 · 0 评论 -
BZOJ4105: [ThuSC2015]平方运算(并查集+线段树)
传送门题意: 支持区间平方(modp)\pmod p,区间求和(p≤10000p\le 10000且为质数)。题解: 每个数在平方意义下有循环节,且所有循环节的gcd≤70gcd \le 70,那么每个点维护7070个数就好了。在进入循环前会有一段不循环的区域(呈ρ\rho形),对于之前的直接暴力修改+并查集维护即可。#include<bits/stdc++.h>using namespace原创 2017-12-25 19:29:56 · 479 阅读 · 1 评论 -
BZOJ4025: 二分图(线段树+并查集)
传送门题解: 每个边分给logn\log n个区间,之后从上往下做并查集即可。 注意按秩合并,这样才可以撤销操作。#include<bits/stdc++.h>using namespace std;const int Maxn=4e5+50;inline int rd(){ char ch=getchar();int i=0,f=1; while(!isdigit(ch)原创 2017-12-17 20:34:32 · 509 阅读 · 0 评论 -
HDU5420:Victor and Proposition(KD树)
传送门题解: 这是经典的KD树模型,所以直接KD树优化建边即可。不过需要注意的是KD树上的点不能是原来的点,要新建一个映射点连向原来的点,因为原来的点如果增加了本来没有的连边会对答案有影响。。(刚才搜了搜好像全是线段树?? 赶紧去学一学)upt:: 线段树做法,可持久化线段树合并,比kd树好打多了。。 Code : https://paste.ubuntu.com/26511原创 2018-02-03 12:59:35 · 290 阅读 · 0 评论 -
UOJ#77. A+B Problem(线段树+最小割)
传送门题解:此类黑白染色的问题,通常可以用最小割解决。 先把所有贡献加入ans" role="presentation">ansansans。 对于一个点,建边: S→wii→bides" role="presentation">S→wii→bidesS→wii→bidesS\mathop{\rightarrow}\li原创 2018-02-04 21:41:29 · 454 阅读 · 0 评论 -
HDU5306 : Gorgeous Sequence(吉司机线段树)
传送门题意: 区间chkminchkminchkmin,求最大值,求和。题解: 吉司机线段树 裸题。 复杂度O(能过)O(nlog2n)O(nlog2n)O(n log^2n)#include <bits/stdc++.h>typedef long long LL;using namespace std;inline int rd() { char ...原创 2018-02-10 18:12:45 · 596 阅读 · 0 评论 -
BZOJ4355:Play with sequence(吉司机线段树)
传送门题解: 原来的赋值操作相当于加上−∞−∞-\infty之后chkmaxchkmaxchkmax。 注意到给的数据保证0肯定作为最小值出现,相当于要维护加和chkmaxchkmaxchkmax和支持查询最小值个数的线段树,这明显是吉司机线段树。同时维护add,chkmaxadd,chkmaxadd,chkmax只需要保证addaddadd比chkmaxchkmaxchkmax先下传...原创 2018-02-11 12:37:39 · 386 阅读 · 0 评论 -
BZOJ5077: [Ctsc2016]时空旅行(线段树+凸包)
传送门题解: 首先答案为min(x−xi)2+cimin(x−xi)2+ci\min {(x-x_i)^2+c_i},移项得x2−2xix+x2i+cx2−2xix+xi2+cx^2 -2x_ix+x_i^2+c 其实是给一堆直线和给定的xxx,求与直线最下方的交点。那么显然是维护凸壳了,因为一个星球只对部分时空产生影响,那么我们在线段树上把这些直线丢进去,维护线段树上每个节点的凸壳。...原创 2018-02-26 18:25:06 · 347 阅读 · 0 评论 -
Uestc844 :程序设计竞赛(动态DP)
传送门题解:线段树傻逼题?? Naive!今年冬令营黑科技之一:动态DP。慢着,动态DP不是NOIP内容吗?NOIP是动态规划,这个叫动态动态规划。。用cur" role="presentation">curcur\text{cur}表示以当前数结尾的最大后缀,ans" role="presentation">ansans\text{ans}表示全局最大值,写出转移方程:原创 2018-02-06 21:48:01 · 278 阅读 · 0 评论 -
Codechef:Painting Tree/KILLER(二进制分组)
传送门题解:这道题,一开始想到自然是线段树合并了,每个点维护个fi,jf_{i,j}fi,j表示从jjj开始上到iii,其他内部配对的最小值。不过这样就要支持区间加二次函数求最大值,根据bzoj某道题的经验,显然是不能在线段树上搞的。然后仔细观察一下,发现这个(h−depx)(h-dep_x)(h−depx)连续,进一步发现,这是一个关于depidep_idepi的二次函数!所以启发式...原创 2018-11-13 16:38:36 · 459 阅读 · 2 评论