线段树
文章平均质量分 69
gjghfd
这个作者很懒,什么都没留下…
展开
-
bzoj4881 [ Lydsy2017年5月月赛 ] -- 二分图染色+线段树
以下是Claris的题解:若线段 i 和 j 相交,那么在它们之间连一条边。若这个图不是二分图,那么无解,否则令cnt 为连通块个数,那么 ans = 2cnt。在二分图染色的过程中,每个点只需要被访问一次。对于当前所在的点 x,它可以一步走到 [1, x) 里 p[i] > p[x] 的所有 i,以及 (x, n] 里 p[j] 用线段树维护所有没走过的点,记录每个区间 p 最小与最大的两原创 2017-05-26 16:45:52 · 235 阅读 · 0 评论 -
Codeforces452F Permutation -- 线段树 + Hash
假如不存在长度大于等于 33 的等差数列,那么对于第 ii 个数 aia_i , ai−ka_i-k 和 ai+ka_i+k 都在一定在 ii 的左边或右边。那么建一棵权值线段树,从左往右扫一次,判断一下 [x−maxk,x−1][x-max_k,x-1] 与 [x+1,x+maxk][x+1,x+max_k] 反转后 HashHash 值是否相等。#include<cstdio>#include原创 2017-10-05 14:35:31 · 250 阅读 · 0 评论 -
[ 2-SAT 线段树 ] Codeforces Gym 100159 Facebook Hacker Cup 2012 I.Unfriending
%%%Manchery题解#include<bits/stdc++.h>using namespace std;#define ll long longinline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p原创 2017-10-21 09:35:23 · 316 阅读 · 0 评论 -
[ 线段树 ] BZOJ3276
Source是骗人的。。树套树空间不够。。 将距离离散一下,建一棵线段树,一直扩展就好了。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<queue>using namespace std;inline char nc(){ static原创 2017-12-22 20:30:43 · 252 阅读 · 0 评论 -
[ 李超线段树 ] BZOJ3165
裸题。#include<bits/stdc++.h>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline void原创 2017-12-15 20:28:30 · 285 阅读 · 0 评论 -
[ 线段树 ] Codeforces903G
转换成求最小割,线段树维护就好了。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=200010;ll c[N<<2],p[N<<2],f[N];int k,n,m,Q;int a[N];int t[N],nx[N],w[N],h[N],num;int x,y,z;inline v原创 2017-12-16 12:25:41 · 506 阅读 · 0 评论 -
[ 树上启发式合并 线段树 单调栈 ] BZOJ5040
可以用单调栈或线段树建出树,然后dsu on tree就好了。#include<bits/stdc++.h>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==原创 2017-12-26 13:39:25 · 407 阅读 · 0 评论 -
[ 线段树套treap ] [ TJOI2016&&HEOI2016 ] BZOJ4552
题解#include<bits/stdc++.h>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline void原创 2017-12-13 13:29:04 · 302 阅读 · 0 评论 -
[ 线段树 ] [ POI2014 ] BZOJ3521
令 aia_i 表示前 ii 个数中 pp 的个数减 jj 的个数。 如果只考虑左端点的限制,那么对于区间内所有数,必须满足 al−1≤aia_{l-1}\le a_i 。 枚举每个点作为左端点,在线段树上二分求出能达到的最远位置。右端点同理。 然后双指针扫一遍,再用一颗权值线段树维护答案就好了。#include<bits/stdc++.h>using namespace std;inli原创 2017-12-18 20:27:32 · 239 阅读 · 0 评论 -
[ 树状数组 线段树 ] BZOJ3333
可以发现,一次操作后只有出队的人的逆序对数会改变。预处理出每个人与其后面的人行成的逆序对数,线段树维护身高最小值就好了。 总复杂度 O(nlogn)O(n\log n) 。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;inline char nc(){原创 2018-01-03 15:18:29 · 248 阅读 · 0 评论 -
[ 树套树 ] [ 二次函数 ][ neerc2011 flight ] BZOJ2646
取到最大值的位置有 22 种情况:在二次函数顶点:可用树套树维护。在 ll 或 rr 上:建棵线段树,每个节点存区间内所有二次函数的轮廓线,查询时在轮廓线上二分。合并 22 个轮廓线时先求出所有区间,再对每个区间不停求交点。#include<bits/stdc++.h>using namespace std;inline char nc(){ static char buf[100原创 2017-12-28 17:01:44 · 533 阅读 · 0 评论 -
[ 线段树 tarjan缩点 ] [ SNOI2017 ] BZOJ5017
一个暴力的思想是每个点向能引爆它的点连边,求出强联通分量统计答案。但这样是 O(n2)O(n^2) 的。然后线段树优化建图就好了。#include#include#include#includeusing namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return原创 2018-01-16 15:43:11 · 267 阅读 · 0 评论 -
[ 线段树 树状数组 ] Codeforces935F Fafa and Array
先考虑询问。 对于边界的点直接更新答案。 对于不在边界上的点:若 ai−1≤aiai−1≤aia_{i-1}\le a_i 且 ai+1≤aiai+1≤aia_{i+1}\le a_i ,增大 aiaia_i 时答案的增加量为 2x2x2x 。若 aiaia_i 在 ai−1ai−1a_{i-1} 和 ai+1ai+1a_{i+1} 之间,设 t=max(ai−1,ai+1)−ait=...原创 2018-02-27 10:54:53 · 359 阅读 · 0 评论 -
[ 后缀自动机 树上启发式合并 线段树 树状数组 ] [ 雅礼集训 2017 Day7 ] LOJ#6041
对原串建后缀自动机,222 个前缀的最长公共后缀就是其反串的后缀树中对应点的 lcalcalca 的 lenlenlen 值。 现在问题转化为:给定一棵树,求编号在 [l,r][l,r][l,r] 的 222 个点的 lcalcalca 的最大深度。 考虑一个暴力的做法:枚举树上每个点作为 lcalcalca ,将其子树中所有点按编号排序,那么对于每个点,离它最近的 222 个点一定是最优的,...原创 2018-03-07 07:05:28 · 431 阅读 · 0 评论 -
[ 线段树 ] HDU5306 Gorgeous Sequence
吉利论文例题#include<bits/stdc++.h>using namespace std;char nc() { static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;...原创 2018-03-23 14:15:27 · 215 阅读 · 0 评论 -
[ 线段树 单调队列 ] Codeforces859F Ordering T-Shirts
假设前 ii 号衬衫买了 tit_i 个,容易发现答案是合法的仅当 min(c,∑k=2i−12j−1sk)≤tj−ti−1,∀ i≤j\min(c,\sum_{k=2i-1}^{2j-1}s_k)\le t_j-t_{i-1},\forall ~i\le j 令 SiS_i 表示 ss 的前缀和。 min(c,S2j−1−S2i)≤tj−ti−1,∀ i≤j\min(c,S_{2j-1}-S原创 2017-10-19 11:34:31 · 587 阅读 · 0 评论 -
bzoj4552 [ TJOI2016 && HEOI2016 ] -- 二分+线段树
二分答案。将大于等于答案的值设为1,小于的设为0,然后每次操作就变成了区间覆盖。线段树即可。代码#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define N 100010struct Q{ int l,r; bool d;}q[N];原创 2017-09-20 19:10:57 · 277 阅读 · 0 评论 -
bzoj3228 [ SDOI2008 ] -- 扫描线 + 线段树
首先曼哈顿距离有如下性质: |x1−x2|+|y1−y2|=max(|x1−y1−(x2−y2)|,|x1+y1−(x2+y2)|)|x_1-x_2|+|y_1-y_2|=\max(|x_1-y_1-(x_2-y_2)|,|x_1+y_1-(x_2+y_2)| ) 于是将点 (x,y)(x,y) 的坐标转化为 (x−y,x+y)(x-y,x+y),点控制的范围就变成了一个正方形,扫描线+线段树即原创 2017-09-24 19:34:51 · 382 阅读 · 0 评论 -
bzoj2957 -- 线段树
考虑线段树。对于一段区间,记录它的最大斜率和只考虑区间内约束的答案。合并时一段区间的答案就是左子区间的答案加上右子区间考虑左子区间约束之和的答案。求一个区间约束为h的答案时,判断左子区间与h的关系。如果不大于h,答案就是右子区间约束为h的答案,否则递归左子区间。时间复杂度O(nlog2n)代码: 1 #include 2 #include 3 #include 4 #inclu原创 2017-05-26 16:44:47 · 314 阅读 · 0 评论 -
bzoj2733 [ HNOI2012 ] -- 并查集+线段树合并
用并查集记录每个联通块的根节点,每个联通块建一棵线段树,合并时合并线段树就可以了。代码: 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 100010 6 struct node{ 7 int l,r,x; 8 }c[N*20]; 9 int i,j,k,n,m,l,r,a[N]原创 2017-05-26 16:43:03 · 216 阅读 · 0 评论 -
bzoj2006 [ NOI2010 ] && bzoj3784 --点分治+线段树+堆
bzoj2006:定义一个四元组{x,l,r,w},表示左端点在x,右端点在[l,r]的超级和弦的最大美妙度在将w作为右端点时取到,w可以用前缀和+线段树/ST表求出。对于每个i,我们将{i,i+L-1,i+R-1,w}放入一个大根堆中,每次取出美妙度最大的一个加到答案中,并将{i,l,w-1,x},{i,w+1,r,x}放入堆中。这样就相当于将左端点在i、右端点在w的超级和弦去掉。做k次就原创 2017-05-26 16:42:32 · 421 阅读 · 0 评论 -
codeforces819B Mister B and PR Shifts -- 线段树
令did_i表示ii次操作后的答案。 考虑pip_i对djd_j的贡献原创 2017-07-02 18:02:45 · 407 阅读 · 0 评论 -
codeforces818D Multicolored Cars -- 线段树上二分
用线段树记录当前每种颜色的出现次数,枚举每辆车更新。 当颜色是mm时在线段树上二分,将出现次数比mm的出现次数小的颜色标记为1。 没有被标记过的颜色就是答案了。原创 2017-07-02 17:36:23 · 763 阅读 · 0 评论 -
bzoj3489 -- 可持久化树套树
令lastilast_i表示aia_i前一个出现的位置(没出现过为00),nextinext_i表示aia_i后一个出现的位置(没出现过为n+1n+1)。 那么要满足的条件是:lasti<l,nexti>r,l≤i≤r last_i<l,next_i>r,l \leq i\leq r 将aia_i按lastilast_i排序,对nextinext_i建一棵主席树,每一个节点存一个线段树记录区间内原创 2017-07-04 17:14:10 · 465 阅读 · 0 评论 -
bzoj3956 -- 单调栈 + 线段树
对于区间[l,r][l,r],求出它的最大值的位置。显然不可能有点对跨越最大值。那么用单调栈预处理出每个点作为左端点、右端点的点对个数,求一个前缀和就可以了。原创 2017-07-13 17:15:15 · 592 阅读 · 0 评论 -
codeforces533A Berland Miners -- 线段树
离散。先求出每个点到根路径上hih_i的最小值、次小值,记为bi,cib_i,c_i。 开一个桶,将每个bib_i在桶中的位置加11,每个sis_i在桶中的位置减11。 那么只有当所有后缀和不小于00时满足条件。 如果要增加一个点的高度,先从大到小枚举桶中的元素,找到第一个小于00的位置kk,那么最后一定是将一个点的hih_i增加到kk。 用线段树维护后缀和的最小值,枚举这个点,更新线段树,原创 2017-07-06 17:14:07 · 431 阅读 · 0 评论 -
codeforces788E New task -- 线段树
令LiL_i表示点ii左边不大于aia_i的数的个数,RiR_i表示点ii右边不大于aia_i的数的个数。 先考虑没有修改的情况。将aia_i相等的点一起考虑,令sis_i表示aja_j等于ii的jj的个数,lsumilsum_i表示∑ij=1Lj\sum_{j=1}^iL_j,rsumirsum_i表示∑sajj=i+1Rj\sum_{j=i+1}^{s_{a_j}}R_j。枚举中间的点kk,对原创 2017-07-09 17:51:17 · 481 阅读 · 0 评论 -
codeforces833B The Bakery -- DP + 线段树
考虑DP。令fi,j表示前i 个盒子装前 j 个蛋糕的答案: fi,j=max(fi−1,k+vk+1,j),k∈[1,i−1]其中vi,jv_{i,j}表示第 i 个蛋糕到第 j 个蛋糕装在同一个盒子里的权值。 但这样是O(n2k)的,然后我们考虑用线段树优化原创 2017-07-31 09:04:58 · 518 阅读 · 2 评论 -
codeforces830B Cards Sorting -- 线段树
用线段树记录区间有几个数还没被取走,将所有数从小到大排序后依次更新答案就可以了。注意相等的时候取的数是在上次取的数后面的第一个数。代码:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 100010#define ll long long原创 2017-07-18 17:46:39 · 498 阅读 · 0 评论 -
codeforces817F MEX Queries -- 线段树
先将li,ril_i,r_i离散。 用线段树维护区间出现的数的个数。对于1,21,2操作,区间setset即可。对于33操作,相当于将区间每个数xor 1xor~1,也可以直接维护。 查询时在线段树上二分。 注意因为求的是mexmex,可能不是li,ril_i,r_i中任何一个,对于l+1,r+1l+1,r+1也要离散。原创 2017-07-26 15:20:58 · 534 阅读 · 0 评论 -
codeforces838B Diverging Directions -- 树链剖分 + 线段树
令 aia_i 表示从 ii 到根的边的长度。对于每个点维护 distidist_i 表示从根到 ii 的路径, mindistimindist_i 表示 ii 的子树中 distj+ajdist_j+a_j 的最小值。 然后对于询问 (u,v)(u,v) 分类: 如果 uu 是 vv 的祖先,由于权值都是正整数,答案为distv−distudist_v-dist_u。 否则答案为mindis原创 2017-08-18 21:13:41 · 559 阅读 · 0 评论 -
bzoj4977 -- 线段树模拟费用流
神题题解代码#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define N 100010struct Node{ int w,f;}g[N<<1],d[N];long long Ans;int i,j,k,n,m,a[N],x,y,h,w[原创 2017-08-22 18:50:39 · 976 阅读 · 0 评论 -
[ 线段树 泰勒展开 ] Codechef April Challenge 2018 Division 1 Chef at the Food Fair
大佬教我做题ans=∏i=LR(1−pi)=eln∏Ri=L(1−pi)=e∑Ri=Lln(1−pi)ans=∏i=LR(1−pi)=eln∏i=LR(1−pi)=e∑i=LRln(1−pi)ans=\prod_{i=L}^R (1-p_i)=e^{\ln{\prod_{i=L}^R (1-p_i)}}=e^{\sum_{i=L}^R\ln{(1-p_i)}} 将 ln(1−x)ln(...原创 2018-04-18 15:47:31 · 403 阅读 · 0 评论