![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线段树
文章平均质量分 50
DOFYPXY
这个作者很懒,什么都没留下…
展开
-
[2017雅礼7-2]翻卡片 线段树
对于某张卡片,操作可分为三类: Ta#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=200100;int a[maxn<<2],b[maxn][2],c[maxn],d[maxn<<2],n,m,size;bool mark原创 2017-07-10 16:55:45 · 582 阅读 · 0 评论 -
[LOJ2275][JXOI2017]颜色 线段树+优先队列
显然,任意一种合法的删颜色的方式都和一对合法的切环的断点一一对应。 然后就和BZOJ4382的第一问一样了。 //反正我就把一个≤\le改成了==就过了 代码:#include#include#include#include#include#include#includeusing namespace std;const int maxn=300010;int n,原创 2018-01-23 22:03:19 · 748 阅读 · 0 评论 -
[2018雅礼集训1-8]送你一堆区间 线段树优化DP
题面 其实做着题有点受海明距离那题启发,状态都设计的差不多。 给关键点离散化后,把每个区间重新定位,并把左端点按从小到大排序。设fi,jf_{i,j}表示只考虑前ii个区间,前jj个关键点都覆盖到了,假设第ii个区间为[li,ri][l_i,r_i]那么有转移: fi,j=fi−1,jf_{i,j}=f_{i-1,j} fi,ri+=∑li−1≤k≤rifi−1,kf_{i,r_i}+=\原创 2018-01-08 22:27:28 · 955 阅读 · 0 评论 -
[2018雅礼集训1-18]日记 线段树
真tm线段树神题。。。 设[l,r][l,r]复杂值为Tl,rT_{l,r} 首先对于询问[l,r][l,r],把问题转化为:∑ni=1∑nj=iTi,j−∑l−1i=1∑l−1j=iTi,j−∑ni=r+1∑nj=iTi,j\sum_{i=1}^n\sum_{j=i}^nT_{i,j}-\sum_{i=1}^{l-1}\sum_{j=i}^{l-1}T_{i,j}-\sum_{i=r+1}^原创 2018-01-20 19:44:48 · 536 阅读 · 0 评论 -
[BZOJ3600]没有人的算术 重量平衡树+线段树
先讲讲重量平衡树是什么,可以先看2013年国家集训队clj的论文。 重量平衡树首先要保证平衡而且不能是均摊平衡,然后要么没有旋转,要么旋转是影响的子树大小要期望loglog\log或者均摊loglog\log。Treap和替罪羊树都满足重量平衡树的条件。 那么对于这题,发现复杂度瓶颈在于比较两个数的大小(复杂度可能达到指数级),因为操作中出现的数的种类是O(n)O(n)O(n),我们希望能给每...原创 2018-03-14 21:13:21 · 444 阅读 · 0 评论 -
[ARC063] F - すぬけ君の塗り絵 2 / Snuke's Coloring 2 单调栈+线段树
首先发现一定能找到一个最优解使得矩形的每条边要么是边界,要么有一个关键点,所以转化为求周长最大的内部不存在关键点的矩形。 不难发现选择一竖条或者一横条是一定合法的,那么答案下界就至少是2(max(h,w)+1)2(max(h,w)+1)2(\max(h,w)+1),那么最优解一定过x=w2x=w2x=\frac{w}{2}或者y=h2y=h2y=\frac{h}{2},因为在某个四分之一矩形内部...原创 2018-04-16 14:36:10 · 561 阅读 · 0 评论 -
[2018雅礼省选集训4-2]Problem A 位运算+势能分析线段树
首先把∧∧\land看成把某些位强制变为000,把∨∨\lor看成把某些位强制变为111。那么对于一次修改,如果一个区间内的数这些位都相同就打标记,否则暴力处理左右区间即可。 先证明这样做的复杂度是对的,设fi=flsoni+frsoni+∑20k=0[i中所有数第k位相等]fi=flsoni+frsoni+∑k=020[i中所有数第k位相等]f_i=f_{lson_i}+f_{rson_i}+...原创 2018-04-16 15:01:27 · 467 阅读 · 0 评论 -
[BZOJ4919]大根堆 启发式合并+线段树/multiset
先考虑O(n2)O(n2)O(n^2)的DP,设fi,jfi,jf_{i,j}表示考虑子树iii中,选的vvv的最大值≤j≤j\le j时最多能选多少个点,那么考虑一个点的转移。 先合并儿子:fi,j=∑x∈sonifx,jfi,j=∑x∈sonifx,jf_{i,j}=\sum_{x\in son_i} f_{x,j} 在选上他自己:chkmax(fi,≥vi,fi,vi−1+1)chkma...原创 2018-03-28 21:42:50 · 445 阅读 · 0 评论 -
[BZOJ2098]又是nand 树链剖分+位运算
观察nand这个运算,发现它有交换律但是没有结合律,所以就不要考虑各种差分或者分段计算合并的方法,而且得按顺序维护。 首先可以想到树链剖分,因为有顺序,所以线段树区间上要维护从lll到rrr的运算结果和从rrr到lll的运算结果,而且对于运算结果还与进来的初值有关,发现每一位是独立的,我们要对每一位维护初值是0/10/10/1,运算顺序是l→r/r→ll→r/r→ll\to r/r \to l的...原创 2018-04-22 22:13:42 · 609 阅读 · 0 评论 -
[联合集训6-18] 栈 吉司机线段树
这个做法很巧妙。 考虑一个单调栈的插入过程。假如把插入的数倒过来,依次和栈底元素chkmax,如果chkmax成功就把它放入栈底,最终等效于顺序插入的结果。 于是我们把所有操作倒序处理,假如一个单调栈被询问了xxx次,我们就在线段树上给其分配xxx个下标,也就是说最后线段树一共是询问个数个下标,每个下标对应的是某个单调栈的某次询问。 那么用吉司机线段树维护区间chkmax,遇到一个询问就把对...原创 2018-06-20 21:22:00 · 545 阅读 · 0 评论 -
[联合集训6-25] 蓝雨 线段树+主席树+hash
先考虑p=qp=qp=q的情况,习惯先把求第kkk大变成求第kkk小。 那么我们逐个确定第kkk小的串每种数字包含了多少个。假设当前我们已经确定了x−1x−1x-1之前的数的个数,此时对于每个左端点iii,合法的右端点都是一个区间[li,ri][li,ri][l_i,r_i]。现在考虑二分确定xxx的个数,我们把序列中为xxx的位置单独挑出来,这些位置把序列分成若干段,假如二分有midmidmi...原创 2018-06-26 20:46:05 · 378 阅读 · 0 评论 -
[BZOJ2865]字符串识别 后缀自动机+线段树
首先只出现过一次的子串,就是SAM上那些|Right|=1|Right|=1的点。 对于这些点考虑它们的最小拓展长度为Mini=Maxfai+1Min_i=Max_{fa_i}+1,又因为|Right|=1|Right|=1,所以这个点在字符串上的位置就是MaxiMax_i。 所以对于[Maxi−Mini+1,Maxi][Max_i-Min_i+1,Max_i]的位置xx有一个长度为MiniM原创 2018-01-04 21:50:40 · 514 阅读 · 0 评论 -
[BZOJ4382][POI2015]Podział naszyjnika 优先队列+线段树 hash+Twopoints
听说hash做法很简单。。。不管了,我写的是数据结构。。。 以下不要计较开闭区间等等。 考虑从左往右枚举右切口rr,假设左切口ll合法,那么对于每种颜色,要么分布在[1,l]∪[r,n][1,l]\cup[r,n],要么分布在[l,r][l,r]。 对于满足第一种情况的颜色,记precpre_c为其rr在之前最后一次出现的位置,那么要满足l>max{prec}l>max\{pre_c\},可以原创 2018-01-03 22:01:41 · 559 阅读 · 0 评论 -
[2017雅礼7-6]right 分块
稍加分(da)析(biao)可知,当p为奇数时,SG(x)=x&1,当p为偶数时,SG(x)=(x%(p+1)==p)?2:((x%(p+1))&1)。 奇数的话相当于区间翻转,区间异或和,直接线段树即可。 偶数的话分块来处理,每个块维护一个add标记和两个有序数组,分别表示奇余数和偶余数,区间加的时候整块的打标记,零散的直接重构,时间复杂度O(n/s+slogs)。查询的时候整块lower_b原创 2017-07-09 21:13:38 · 350 阅读 · 0 评论 -
[SPOJ1043,1557,1716,2713,2916,4487,6779,19543]GSS八题系列
[SPOJ1043]GSS1求区间最大字段和,不带修改,线段树维护总和sum,最大子段和gss,最大左子段和lgss,最大右子段和rgss,即可。 更新答案: sum=ls->sum+rs->sum; lgss=max(ls->lgss,ls->sum+rs->lgss); rgss=max(rs->rgss,rs->sum+ls->rgss);原创 2017-10-19 08:29:18 · 462 阅读 · 0 评论 -
[2017纪中11-6]奇怪的队列 树状数组+二分/线段树
题面 考虑先按高度排序,那么第i位置的人一共有n-i个人比他高,为了方便,这个人报的数字t=min(t,n-i-t)。 那么从小到大把这些人放进序列里。每次放在当前序列t的位置上,然后把这个位置删除即可。 可以用树状数组+二分搞。复杂度O(nlog^2n)。 线段树正解 nlog^2n代码:#include<iostream>#include<cstdio>#include<algor原创 2017-11-07 15:10:15 · 454 阅读 · 0 评论 -
[2017纪中10-28]序列操作 贪心+线段树/二分
题面 显然每次操作贪心对最大的c[i]减一是正确的。但如果从大到小排序,减前面c[i]个并不能保证有序。例如4,3,2,2,2,1,c[i]=3,减得4,3,1,2,2,1。我们应该把第c[i]个数求出来,>c[i]的照常减,=c[i]的优先减靠右的即可。线段树维护。 听说还可以二分? 代码:#include<iostream>#include<cstdio>#include<algori原创 2017-10-30 07:42:01 · 472 阅读 · 0 评论 -
[2017纪中10-24]筹备计划 线段树
题面 设a[i]为i点学生个数。 考虑用线段树维护这么几个东西:sum0(区间内a[i]和),sum1(区间内a[i]*i和),d0(区间是否全部不可用),d1(区间是否全部可用)。 sum0,sum1只有单点修改,d0,d1只有区间覆盖。 那么我们可以O(logn)计算下列东西: 不考虑可用不可用的最优答案:就是中位数,通过sum0就可以搞定。 某一点X的答案:sum0[1,x-1]原创 2017-10-24 16:41:02 · 308 阅读 · 0 评论 -
[2017纪中10-25]天才绅士少女助手克里斯蒂娜 线段树
题面 线段树维护三个∑即可。 AC的里面跑的最慢的。。。好像因为每次query了三下。 代码:#include<iostream>#include<cstdio>#define ll long longusing namespace std;const int mod=20170927;const int maxn=1000010;int n,m;ll v[maxn][2];原创 2017-10-25 16:52:13 · 1228 阅读 · 0 评论 -
[2017纪中11-3][ARC069-F]高考是不可能高考的 2-sat+线段树优化建图
题面 原题 首先考虑二分答案k,验证就可以用2-sat。假如要选某一个x[i],那么x[i]左右距离k的区间内的点都不能选,于是这些点都必须选另一半;y[i]同理。 由于边数太多,直接建图是不可接受的,考虑到不能选的点都在一个区间内,于是把所有x[i],y[i]排序,开一棵线段树,x的位置存y的点编号,y的位置存x的点编号(因为要连另一半嘛),建边时向线段树上节点连,线段树从根往叶子连边,边数原创 2017-11-03 21:04:10 · 869 阅读 · 0 评论 -
[ARC085]F - NRE RMQ优化DP
题面 我们先假设a全部填了1,那么海明距离就是b中0的个数。 那么假设a中有一个ai=0,若bi=0,那么海明距离-1,否则海明距离+1。 于是可以设计状态f[i][j]表示[i+1,j]全为1时,1~i中海明距离的最小值;如果把所有询问按l升序,r降序排序,就可以转移了。 f[i][j]<-f[i-1][j]; 若i=l,j=r,还有f[i][j]<-min{f[i-1][k]} i-1原创 2017-12-05 09:12:48 · 817 阅读 · 1 评论 -
[BZOJ2957]楼房重建
首先显然可以把点看成斜率,然后就是求一个从头开始的最长上升子序列,支持单点修改。 分块做法(无脑): 考虑把序列分成BB块,每一块维护一个从头开始的最长上升子序列,并用一个栈记录。每次询问相当于把所有块扫一遍,在当前块栈中二分到第一个大于上一块最大值的位置,然后贡献加上其到栈顶的元素个数,复杂度O(nlogBB)O(\frac{n\log B} {B})。修改就直接暴力重构块,复杂度O(B)O原创 2018-01-11 21:54:15 · 276 阅读 · 0 评论 -
[BZOJ2138]stone Hall定理+线段树
假设把每堆石子拆成AiAiA_i个点,每个询问拆成KiKiK_i个点,就相当于每次添加KiKiK_i个点,然后询问此时的最大匹配能增加多少。 通过Hall定理可以判断匹配的合法性。但因为本题的区间没有包含,把询问按照LiLiL_i排序,RiRiR_i是递增的,在剔除掉没有被任一区间覆盖的石子堆之后,一段询问区间对应的石子也是一段连续的区间,我们不需要判断每个子集,而只需要判断每个区间是否满足Ha...原创 2018-07-06 21:52:44 · 587 阅读 · 0 评论