![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
DOFYPXY
这个作者很懒,什么都没留下…
展开
-
[BZOJ3531] SDOI2014 树链剖分+动态开点线段树
首先发现是一棵树,想到树链剖分来维护路径。 但是如何把不同宗教的点分开计数?想到给每一个宗教开一颗线段树来维护,因为总共点数只有10^5个,可以采取动态开点来保证内存不超。 代码type xtree=^xtreenode; xtreenode=record max,sum,l,r:longint; ls,rs:xtree; end; edge=^edgenode;原创 2017-02-27 21:09:30 · 547 阅读 · 0 评论 -
[BZOJ3585][清华集训2014]mex 主席树
考虑用主席树维护到第i个位置时,每个数最后一次出现位置,也就是说维护的是n棵权值线段树,线段树上每个节点表示值域在此之内的每个数最后一次出现位置的最小值。 那么一个询问(l,r)就是在第r棵线段树上查最小的且上一次出现位置小于l的数,经典操作。 注意离散化的时候要把每个值和它+1扔进去离散化,而且要去重,因为不能破坏整数的连续性。 代码:#include<iostream>#include<原创 2017-12-12 20:42:55 · 410 阅读 · 0 评论 -
[BZOJ2957]楼房重建
首先显然可以把点看成斜率,然后就是求一个从头开始的最长上升子序列,支持单点修改。 分块做法(无脑): 考虑把序列分成BB块,每一块维护一个从头开始的最长上升子序列,并用一个栈记录。每次询问相当于把所有块扫一遍,在当前块栈中二分到第一个大于上一块最大值的位置,然后贡献加上其到栈顶的元素个数,复杂度O(nlogBB)O(\frac{n\log B} {B})。修改就直接暴力重构块,复杂度O(B)O原创 2018-01-11 21:54:15 · 283 阅读 · 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 · 587 阅读 · 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 · 524 阅读 · 0 评论 -
[LOJ2274][JXOI2017]加法 二分答案+优先队列
大概思路就是:先二分答案xx,check就是从左往右扫,如果当前值不足xx,就贪心地不断选右端点最右的给它加上,然后用线段树\树状数组维护区间加,或者直接用优先队列维护加的次数即可。 具体地,开两个优先队列Q,HQ,H,前者维护当前可选区间的右端点最大值,后者维护当前已选区间左端点最小值,然后从左往右扫到ii: 1. 把左端点位于ii的区间加入QQ。 2. 把左端点小于ii的从HH里扔掉。原创 2018-01-23 21:56:56 · 854 阅读 · 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 · 754 阅读 · 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 · 546 阅读 · 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 · 582 阅读 · 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 · 478 阅读 · 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 · 462 阅读 · 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 · 387 阅读 · 0 评论 -
[BZOJ3110][ZJOI2013]K大数查询 树套树/CDQ分治
树套树做法: 注意到权值很小,于是外层开权值线段树,内层是一个动态开点的区间线段树,维护权值在[L,R],位置在[l,r]的数一共有多少个。 修改就是内层的一个线段树上区间加一。 查询时,外层线段树中先判断左子树中够不够k个数,若够则往左子树递归,不够就减一下后往右子树。 代码(MLE):#include<iostream>#include<cstdio>using namespace原创 2017-12-03 17:38:56 · 305 阅读 · 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 · 877 阅读 · 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 · 1237 阅读 · 0 评论 -
[BZOJ1078]SCOI2008斜堆
仔细观察后发现最后插入的那个点满足下面两个性质 1.一定是极左节点,就是从根一直往左走可以走到的,因为X总是插入在左子树中。 2.一定没有右儿子,显然。 然后又发现,如果某一个点P满足这两个性质但它的祖先K中也有一个满足这两个性质,那么K一定后于P插入,要不然插入P的之前,K就是一个只有右子树的点,然而不可能有只有右子树的点。 所以我们找到满足这两个性质的深度最浅的点,然后把它记录到答案中,原创 2017-02-28 22:04:47 · 503 阅读 · 0 评论 -
[2017雅礼集训]day11 T1 决斗 平衡树+贪心
题目大意:有N个物品不均匀的放在N个盒子里(有些盒子可能很多,有些盒子可能没有),每个物品和每个盒子都有一个权值,要让每个盒子中只能留下一个物品,第i个盒子多余的物品溢出到第i+1个盒子中(n溢出到1)。求一种方案使得溢出完成后,使满足盒子中物品的权值大于该盒子的权值的盒子尽可能多,输出满足条件的最多盒子数。 数据范围:40%:所有物品开始放在一个盒子里。 100%:N<=5e原创 2017-03-18 11:32:40 · 877 阅读 · 0 评论 -
[BZOJ3038&&BZOJ3211] 势能分析线段树
势能分析线段树是这样一个东西,对于某一些操作,不滋磁打标记,只能暴力更改但操作很少次以后就不会改变结果了(最常见的就是区间开根号),我们可以维护一些东西来表示这个区间是否会改变。 例子: 区间开根号,维护min和max,若min>=0且max<=1就不管。 区间整除,维护min和max,若min+1=max,直接变成区间修改或区间加(雅礼集训day1 T1)。代码:type tree=^t原创 2017-04-18 20:43:58 · 1128 阅读 · 0 评论 -
[BZOJ2653]middle 主席树+二分答案
中位数的题目一定要想到二分答案然后把所有数变成1或-1什么的。。。 先离散化,这样最多只有n个值,然后对于每个值建主席树,>=的设为1,<的设为-1。按照升序建的话每次最多更改一个值,也就是logN个点。 设询问区间[ a, b] [ c, d]为然后二分答案K,现在要求的就是在主席树的第K个版本中(b,c)的和,[ a, b]的最大右子段和,[ c, d]的最大左子段和,三个东西加起来是否大原创 2017-04-21 09:05:13 · 359 阅读 · 0 评论 -
[BZOJ1492][NOI2007]货币兑换 斜率优化DP+splay维护凸壳
写着题写的想死。。。来扯扯写着题的过程。。。(我菜啊) 早晨总结了一下昨天写的几道决策单调性和斜率优化dp,然后突然看到这题,准备来写,此时8:30。 看了popoQQQ的题解,感觉这题代码有点难度,不过还是要挑战一下的,然后大概理了理思路和细节,就开始码了,此时9:00。 10:40码完,调了几个splayRE的地方,11:00过了样例(样例很水啊),交一发,TLE(后来分析应该是死循环了)原创 2017-04-26 17:19:40 · 727 阅读 · 0 评论 -
[BZOJ1455]罗马游戏 左偏树+并查集
左偏树用来合并堆,并查集用来维护所在堆的堆顶编号。 然而有的时候要删除堆顶x,然后对并查集进行这样的操作:fa[x]:=merge(x^.l,x^.r); fa[fa[x]]:=fa[x]。这样就给并查集换了个根。 注意被杀了的点不要真正扔出堆,要不然会影响并查集的getfa,打一个kill标记不管它就是了。 代码:type heap=^heapnode; heapnode=recor原创 2017-04-27 07:48:50 · 335 阅读 · 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 · 475 阅读 · 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 · 481 阅读 · 0 评论 -
[2017纪中10-21]Fantasy 优先队列+ST表
题目链接:https://jzoj.net/senior/#main/show/5409 原题。。。同NOI2010超级钢琴。 这种求n个集合最大的k的值,考虑先把每个集合中的最大值扔到一个公共堆里,若某个集合最大值还未从堆中取出,那么这个集合中的次大值就没有必要进堆。从堆中不断取k次即可。假设我们很容易得到每个集合的最大值,并且删除最大值很容易得到次大值等等,这个方法就很可行了。 这题先前缀原创 2017-10-23 07:49:33 · 364 阅读 · 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 · 317 阅读 · 0 评论 -
[2017纪中10-24]方阵 二维ST表
题面 假的数据。。。考场上被坑成0分。 首先两个log的二维ST表很好想,st[i][j][k][l]表示以点(i,j)向右2^k,向下2^l的矩形内的答案。 (假设)考虑真的长不超过宽的两倍,我们可以把它分成两个以宽为边长的正方形(当然可能会有部分重叠),那么询问都转化成正方形,只需要预处理st[i][j][k]表示以点(i,j)向右下2^k的正方形内的答案。时间和空间都少了一个log。原创 2017-10-24 16:20:11 · 820 阅读 · 0 评论 -
[BZOJ2138]stone Hall定理+线段树
假设把每堆石子拆成AiAiA_i个点,每个询问拆成KiKiK_i个点,就相当于每次添加KiKiK_i个点,然后询问此时的最大匹配能增加多少。 通过Hall定理可以判断匹配的合法性。但因为本题的区间没有包含,把询问按照LiLiL_i排序,RiRiR_i是递增的,在剔除掉没有被任一区间覆盖的石子堆之后,一段询问区间对应的石子也是一段连续的区间,我们不需要判断每个子集,而只需要判断每个区间是否满足Ha...原创 2018-07-06 21:52:44 · 604 阅读 · 0 评论