
【数据结构】线段树
文章平均质量分 74
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【BZOJ3064】【TYVJ1518】CPU监控
【题目链接】点击打开链接【思路要点】题目中提到的操作均为区间操作,考虑使用线段树。若不存在A询问,剩余部分属于线段树的基本操作。考虑将题目先简化一下:若不存在C操作,如何用线段树解决本题?首先,对于区间最大值询问,我们维护区间最大值\(Max\)和区间加标记\(tagadd\),分别表示对应区间的最大值和未下传的区间加标记值,其下传方式显然。其次,对于区原创 2018-01-22 11:35:06 · 766 阅读 · 0 评论 -
【BZOJ3196】【TYVJ1730】二逼平衡树
【题目链接】点击打开链接【思路要点】用外层树状数组套内层权值线段树,那么每一个区间对应的权值线段树可以表示为\(O(LogN)\)棵线段树的和(差)。那么在得到的线段树上二分即可在\(O(LogNLogV)\)的时间内解决题目中所给出的询问。注意修改仅涉及单点修改,那么至多会修改\(O(LogN)\)棵线段树,即修改的时间复杂度为\(O(LogNLo原创 2018-01-15 09:56:16 · 341 阅读 · 0 评论 -
【BZOJ1036】【ZJOI2008】树的统计
【题目链接】点击打开链接【思路要点】树链剖分模板题。时间复杂度\(O(QLog^{2}N)\)。【代码】#includeusing namespace std; #define MAXN 30005#define MAXLOG 20#define INF 1e9vector a[MAXN]; struct Node {原创 2018-01-15 17:13:28 · 247 阅读 · 0 评论 -
【BZOJ4196】【UOJ128】【NOI2015】软件包管理器
【题目链接】点击打开链接【思路要点】树链剖分,子树是DFS序中连续的一段,而路径由至多\(O(LogN)\)段组成,剩余部分用线段树解决即可。时间复杂度\(O(QLog^{2}N)\)。【代码】#includeusing namespace std; #define MAXN 120000struct node { int l原创 2018-01-15 17:24:26 · 375 阅读 · 0 评论 -
【BZOJ3262】陌上花开
【题目链接】点击打开链接【思路要点】直观地来想,本题可以先排序一维,然后使用二维数据结构(树套树,KD-Tree)来解决。时间复杂度\(O(NLog^{2}N)\)或\(O(N\sqrt{N})\)。或者也可以用CDQ分治来解决本题,时间复杂度同样为\(O(NLog^{2}N)\)。其中树套树的空间复杂度高达\(O(NLog^{2}N)\),粗糙的实原创 2018-01-16 10:34:49 · 492 阅读 · 0 评论 -
【BZOJ5117】【UOJ164】【清华集训2015】V
【题目链接】BZOJUOJ【思路要点】首先定义一种标记\((a,b)\)表示先给这个区间的数加上\(a\)再和\(b\)取最大值。不难发现题目中的操作均可以表示成\((a,b)\)的形式,分别是\((x,0),(-x,0),(-INF,x)\)。考虑合并标记\((a,b),(c,d)\),那么得到的是\((max(a+c,-INF),max(b+原创 2018-01-24 10:51:36 · 650 阅读 · 0 评论 -
【UOJ170】Picks loves segment tree VIII
【题目链接】点击打开链接【前置阅读】【BZOJ4695】最假女选手【BZOJ3064】【TYVJ1518】CPU监控【UOJ169】【UR #11】元旦老人与数列【思路要点】前置阅读中的前两题中,我们分别对线段树的区间取最大/最小值和线段树的历史最大/最小值进行了研究。本题中,两类问题同时出现,因此我们原创 2018-01-25 16:33:30 · 1076 阅读 · 0 评论 -
【UOJ169】【UR #11】元旦老人与数列
【题目链接】点击打开链接【前置阅读】【BZOJ4355】Play with Sequence【BZOJ3064】【TYVJ1518】CPU监控【思路要点】前置阅读中的两题中,我们分别对线段树的区间取最大/最小值和线段树的历史最大/最小值进行了研究。本题中,两类问题同时出现,因此我们需要将它们整合起来。支持区间取原创 2018-01-25 16:22:49 · 829 阅读 · 0 评论 -
【BZOJ4355】Play with Sequence
【题目链接】点击打开链接【思路要点】题目中提到的操作均为区间操作,考虑使用线段树。注意到数列中的数始终非负,因此3号操作可以看做询问最小值以及其出现次数。2号操作并非线段树的一般操作,无法直接支持标记合并。考虑一个被2号操作定位的区间,记区间最小值为\(Min\),严格次小值为\(Mim\),对该区间实行操作数为\(Val\)的2号操作。若\(Min+Val≥0\),显然这个操作可以看做一个区间加原创 2018-01-18 13:19:52 · 747 阅读 · 0 评论 -
【BZOJ4695】最假女选手
【题目链接】点击打开链接【思路要点】题目中提到的操作均为区间操作,考虑使用线段树。2号操作和3号操作并非线段树的一般操作,无法直接支持标记合并。考虑一个被2号操作定位的区间,记区间最小值为\(Min\),严格次小值为\(Nin\),对该区间实行操作数为\(Val\)的2号操作。若\(Min≥Val\),显然这个操作可以直接忽略。若\(MinVal\),我们可以将这个操作看作是对区间中最小值的整体加原创 2018-01-19 11:06:33 · 1689 阅读 · 0 评论 -
【CodeForces】CodeForces Round #466 (Div. 2) 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】Points on the line【思路要点】枚举最后的区间,用前/后缀和计算区间外的点数。时间复杂度\(O(N+Max\{x_i\})\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 105;template <typename T&...原创 2018-02-26 10:24:08 · 293 阅读 · 0 评论 -
【BZOJ3813】【UOJ38】【清华集训2014】奇数国
【题目链接】BZOJUOJ【思路要点】首先,有一个直观的做法是对每一个质因子维护一棵树状数组,记录区间中该质因子指数的和。询问时先将\(product\)质因数分解的结果求出来,再用快速幂计算欧拉函数。时间复杂度是\(O(60NLogN)\),可以在UOJ上通过,但在BZOJ上会超时。进一步考虑,由于19961993是质数,我们可以方便地计算各个质因数的乘法逆元。所以我们用一颗线段树维护区间取模乘...原创 2018-02-27 09:55:19 · 393 阅读 · 0 评论 -
【USACO】2017 December Contest, Platinum题解
【比赛经历】大概顺利满分了,就是T2的代码比较难调。T2能够直观地反映出GDB和输出调试结合的优越性。【T1】Standing Out from the Herd【题目链接】点击打开链接【题解链接】点击打开链接【思路要点】后缀的前缀是子串,考虑使用后缀结构来解题。笔者选用的是后缀树。对所原创 2018-02-07 12:54:53 · 1031 阅读 · 0 评论 -
【BZOJ3693】圆桌会议
【题目链接】点击打开链接【思路要点】倍长序列,将环上问题化为序列问题。根据Hall定理,如果我们能找到一系列区间使得它们的权值之和大于这些区间并的长度,那么答案为No,否则答案为Yes。显然,找到多于一段的区间是没有意义的,因此,我们认为找到的这一系列区间的并也是一个连续的区间。我们希望找到的区间完全包含的区间的权值之和与其长度的差尽可能大。离散化坐标,枚举最终区间的左端点,对右端点对上述差值的贡...原创 2018-02-17 15:36:17 · 489 阅读 · 0 评论 -
【BZOJ2138】stone
【题目链接】点击打开链接【思路要点】将问题转化一下,每次询问时新建\(K_{i}\)个点向一个区间连边,要求删去最少的点使得剩下的二分图存在完美匹配,并保留没有被删去的点到下一个询问。根据Hall定理,如果我们能找到一系列点,使得它们的总数大于它们对应的区间并的长度(即石头总数),那么剩下的二分图将不存在完美匹配,反之则一定存在。显然,找到的区间的并如果多于一段是没有意义的,因此,我们认为找到的这...原创 2018-02-18 16:13:56 · 399 阅读 · 0 评论 -
【BZOJ1135】【POI2009】Lyz
【题目链接】点击打开链接【思路要点】问题是“是否存在完美匹配”,考虑Hall定理。根据Hall定理,如果我们能找到一系列人,使得它们的总数大于它们对应的区间并的长度(即鞋的总数),那么二分图不存在完美匹配,反之则一定存在。显然,这样的区间的并一定要也是一个连续的区间(否则没有意义)。本题中,如果一系列(人对应的)区间的并是一个连续的区间,那么它们编号同样是一个连续的区间。根据我们之前的推理,答案为...原创 2018-02-19 15:40:17 · 381 阅读 · 0 评论 -
【CodeForces232D】Fence
【题目链接】点击打开链接【思路要点】单独考虑长度为1的询问,显然答案为\(N-1\),否则,我们将原序列和询问序列差分,问题等价于我们需要找到原序列差分后的序列中与询问序列差分后的序列“相等”(这里的“相等”指对应位置互为相反数),且出现位置与询问位置不重合的子串个数。我们可以将原差分序列倍长,对后一半每一项取相反数,并用一个不可见字符连接两端序列,然后求解这个序列的后缀数组,并在询问时在上面二分...原创 2018-03-15 15:20:45 · 282 阅读 · 0 评论 -
【BZOJ2733】【HNOI2012】永无乡
【题目链接】点击打开链接【思路要点】线段树合并裸题。时间复杂度\(O(NLogN+QLogN)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 200005;const int MAXP = 10000005;template <typename T> void chkmax(T &...原创 2018-03-15 17:34:19 · 279 阅读 · 0 评论 -
【BZOJ3307】雨天的尾巴
【题目链接】点击打开链接【思路要点】路径\((x,y)\)可以看做路径\((x,root)\)+路径\((y,root)\)-路径\((Lca,root)\)-路径\((father_{Lca},y)\)。依据这一点进行树上差分和线段树合并即可。时间复杂度\(O(NLogN)\)(\(N\)、\(M\)同阶)。【代码】#include<bits/stdc++.h>using name...原创 2018-03-15 19:38:48 · 534 阅读 · 0 评论 -
【CodeForces】CodeForces Round #465 (Div. 2) 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】Fafa and his Company【思路要点】求\(N\)的因数个数减1,乱做就行。时间复杂度\(O(N)\)或\(O(\sqrt{N})\)【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 5005;template <typename...原创 2018-02-23 20:13:29 · 320 阅读 · 0 评论 -
【BZOJ1503】【NOI2004】郁闷的出纳员
【题目链接】点击打开链接【思路要点】随便用个平衡树、线段树、块状链表、std::vector之类的数据结构维护一下就行了。时间复杂度\(O(NLogN)\)或\(O(N\sqrt{N})\)。【代码】#include<stdio.h>#define MAXN 200000struct data { int left, right, father, size, v, num; }...原创 2018-02-24 11:13:37 · 276 阅读 · 0 评论 -
【BZOJ3790】神奇项链
【题目链接】点击打开链接【思路要点】用Manacher算法求出每个字符为中心的极长回文子串,显然,选取更短的回文子串不会使答案更优。因此,问题转化成了“有若干个区间,至少选取多少个才能使它们的并是\([1,N]\)”。用线段树优化DP即可。时间复杂度\(O(NLogN)\)。【代码】#include<bits/stdc++.h>using namespace std; #defin...原创 2018-02-25 14:22:55 · 480 阅读 · 0 评论 -
【BZOJ4869】【SHOI2017】相逢是问候
【题目链接】点击打开链接【思路要点】欧拉拓展定理:\(a^{\phi(n)}\equiv a^{2\phi(n)}(Mod\ n)\)。而\(\phi(\phi(n))<\frac{n}{2}\)(\(\phi(奇数)=偶数\),\(\phi(偶数)≤\frac{偶数}{2}\)),所以至多有\(O(LogP)\)个不同的模数,模数就会变成1,所以经过\(O(LogP)\)次修改后,被操作数...原创 2018-03-22 20:14:13 · 519 阅读 · 0 评论 -
【USACO】2018 February Contest, Platinum题解
【比赛经历】看完T1先写了一个\(O(NM)\)的暴力,交一发,得分5/10,说明正确地理解了题意。感觉T1码量挺大的,于是先放了一下。T2是傻题,看完10min写掉了,得分10/10。回过头来把T1的线段树码了,一遍写对,不用痛苦地调这个鬼题,提交,得分10/10,跑了1.8s,果然STL不能乱用,差点T了。时间一共过了1.5h-。再看T3,先写了个暴力,找了找规律(还试了试OEIS),然后发现...原创 2018-03-06 10:58:06 · 833 阅读 · 0 评论 -
【BZOJ2333】【SCOI2011】棘手的操作
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 300005#define INF 1e9struct Node { int lc, rc; int maxnum, tag;};Node a[MAXN * 2];int n, q, timer,...原创 2018-03-19 14:03:24 · 243 阅读 · 0 评论 -
【CodeForces】CodeForces Round #468 (Div. 1 + Div. 2) 题解
【比赛链接】Div.1Div.2【题解链接】点击打开链接【Div.2 A】Friends Meeting【思路要点】模拟两个角色向中间移动即可。时间复杂度\(O(B-A)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 100005;template <typename T> void...原创 2018-03-06 15:41:31 · 383 阅读 · 0 评论 -
【BZOJ5103】【POI2018】Ró?norodno
【题目链接】点击打开链接【思路要点】分开考虑每个颜色,每一个点对一个\(K*K\)的正方形有贡献,但同一种颜色的贡献至多为1。从上到下扫描矩阵,我们需要维护一些正方形的进入和删除。由于正方形边长固定,每次贡献实际产生变化的是一个区间。用线段树支持前驱后继的查找即可确定产生变化的区间。每处理完一行,用差分+前缀和统计本行的答案。时间复杂度\(O(N*M*LogM)\),BZOJ老年机太慢了,卡不过去...原创 2018-03-19 20:21:55 · 511 阅读 · 0 评论 -
【BZOJ3110】【ZJOI2013】K大数查询
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】//树套树#include<bits/stdc++.h>using namespace std;#define MAXN 50005#define UTRAL 16000005struct Node {int lc,rc,tag;long long len,sum;};int n,m,N,size,BIT[MAX...原创 2018-03-23 20:50:19 · 207 阅读 · 0 评论 -
【BZOJ2253】纸箱堆叠
【题目链接】点击打开链接【思路要点】树套树,KDTree,CDQ分治都能做。CDQ分治的话需要注意这里要求“严格小于”,取中点时应当保证左右两边第一维坐标不会相等。时间复杂度\(O(NLog^2N)\)或\(O(N\sqrt{N})\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 100005;t...原创 2018-03-25 18:07:12 · 426 阅读 · 0 评论 -
【CodeForces666E】Forensic Examination
【题目链接】点击打开链接【思路要点】这个题写得我很爽啊。想法其实不难,建立多串后缀树,然后将询问离线,用线段树合并来回答询问。后缀的前缀是子串,母串的一个子串可以通过从后缀树上某个表示母串对应后缀的节点向上倍增得到。时间复杂度\(O(|S|Log|S|)\)(\(|S|\),\(Q\),\(M\),\(\sum|T|\)同阶)。【代码】#include<bits/stdc++.h>u...原创 2018-03-31 11:15:35 · 396 阅读 · 0 评论 -
【BZOJ3473】字符串
【题目链接】点击打开链接【双倍经验链接】【BZOJ3277】串【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005#define MAXL 100005struct Suffix_Automaton { map <char, int> child[MAXN...原创 2018-03-29 20:36:59 · 380 阅读 · 0 评论 -
【BZOJ3277】串
【题目链接】点击打开链接【双倍经验链接】【BZOJ3473】字符串【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005#define MAXL 100005struct Suffix_Automaton { map <char, int> child[MA...原创 2018-03-31 11:20:25 · 216 阅读 · 0 评论 -
【BZOJ4538】【HNOI2016】网络
【题目链接】点击打开链接【思路要点】对树进行DFS序标号,令节点\(i\)的DFS序为\(dfn_i\),\(i\)子树内的节点DFS序范围为\([dfn_i,rit_i]\)。对于路径\((a,b)\),节点\(x\)不影响\((a,b)\)的条件是满足以下之一:1、\(dfn_{lca(a,b)}\in(dfn_x,rit_x]\)。2、\(dfn_a\notin[dfn_x,rit_x]\)...原创 2018-03-21 19:31:46 · 315 阅读 · 0 评论 -
【BZOJ1396】识别子串
【题目链接】点击打开链接【双倍经验链接】【BZOJ2865】字符串识别【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005struct Segment_Tree { int lc[MAXN], rc[MAXN], ans[MAXN]; int root, size, ...原创 2018-03-31 16:47:12 · 533 阅读 · 0 评论 -
【BZOJ2865】字符串识别
【题目链接】点击打开链接【双倍经验链接】【BZOJ1396】识别子串【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005struct Segment_Tree { int lc[MAXN], rc[MAXN], ans[MAXN]; int root, size, n...原创 2018-03-31 16:47:58 · 576 阅读 · 0 评论 -
【BZOJ5249】【2018多省省队联测】IIIDX
【题目链接】点击打开链接【思路要点】按照题意,依次先确定每个节点可以填的最大的数。在某个位置\(i\)填入一个数\(x\)时,需要保证可以预定\(Size_{i}-1\)个大于等于\(x\)的数到\(i\)的子树中。如何判断是否能够预定?这实际上就是判断一个二分图是否存在完美匹配,Hall定理即可。具体实现时需要用一棵支持区间加减,维护区间最小值线段树完成。时间复杂度\(O(NLogN)\)。【代...原创 2018-04-09 16:23:17 · 317 阅读 · 0 评论 -
【BZOJ4919】【Lydsy1706月赛】大根堆
【题目链接】点击打开链接【思路要点】显然有\(O(N^2)\)的DP,用线段树维护每一个点的DP数组,用线段树合并支持转移。注意DP数组是单调的,可以将区间取最大值操作看做区间赋值操作。时间复杂度\(O(NLogN)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 2e5 + 5;const in...原创 2018-04-02 15:13:58 · 388 阅读 · 0 评论 -
【BZOJ5253】【2018多省省队联测】制胡窜
【题目链接】点击打开链接【思路要点】首先,一个询问的答案只和询问串的在主串中所有出现的位置有关。直接求解所有出现位置显然会超时,一种可行的方法是用离线询问+后缀自动机(树)+线段树合并来维护出现位置的右端点集合。先解决一个小问题:定位一个询问可以在后缀树上倍增在\(O(LogN)\)的时间内完成。现在我们有了一棵维护着所有询问串出现位置的右端点的线段树,考虑如何得到答案。考虑计算出所有的两个断点把...原创 2018-04-10 17:32:40 · 968 阅读 · 2 评论 -
【BZOJ2342】【SHOI2011】双倍回文
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】//PalindromicTree#include<bits/stdc++.h>using namespace std;#define MAXN 500005int n; char s[MAXN];struct Palindromic_Tree { int child[MAXN][26], ans; int f...原创 2018-04-03 18:49:53 · 261 阅读 · 0 评论 -
【BZOJ5286】【HNOI2018】转盘
【题目链接】点击打开链接【思路要点】首先有一个不是非常显然的结论,对于每个询问,一定有一种最优解是从某个点开始先等待一段时间,然后不停顿地走完一圈。关于这个结论的证明我们可以考虑我们现在有一个解的答案为\(Ans\),路径上最后一个点为\(x\),那么\(x\)之前的一个点被经过的最后时刻至多是\(Ans-1\),在这个点之后停顿会让这个点以及它之前的所有点最后被经过的时间变早,是不会更优的。把序...原创 2018-04-17 18:33:24 · 764 阅读 · 0 评论