数据结构
文章平均质量分 53
Freopen
这个作者很懒,什么都没留下…
展开
-
「WC2020」有根树(轻重链剖分)
题目容易发现题目中那个包含111的连通块是提示你的,并不是来限制你的。那么答案一定是SSS中选择最大的若干个www,剩下的www的最大值≤∣S∣\leq |S|≤∣S∣。设剩下的 www为集合XXX考虑一个调整的过程:如果∣S∣<maxw∈Xw|S| \lt \max_{w \in X} w∣S∣<maxw∈Xw,则选出maxw∈Xw\max_{w \in X} wmaxw∈Xw从XXX删去后加入SSS。如果∣S∣>maxw∈Xw|S| \gt \max_{w\in原创 2020-08-08 20:03:38 · 808 阅读 · 0 评论 -
CODECHEF DISTNUM: Simple Queries(三维偏序)
题面首先这个离谱的询问一:关于不同的数的和,可以构造求出每个点(x,Sx)(x,S_x)(x,Sx)的前面第一个(y,Sy=Sx)(y,S_y =S_x)(y,Sy=Sx),那么把(y,x)(y,x)(y,x)看做一个二维平面上的点,那么对[l,r][l,r][l,r]中不同数的个数即为y<l,l≤x≤ry \lt l , l \leq x \leq ry<l,l≤x≤r的点数。那么在没有插入删除的情况下这就是一个三维偏序(注意128MB卡内存,可以用离线的方法树状数组套树状数组空间原创 2020-07-27 19:30:30 · 248 阅读 · 0 评论 -
20200726模拟赛 C.树高
待填。人生第一次在ACACAC前有90次提交记录的题。人生第一次写了10K10K10K代码的题(写完6KTreap6KTreap6KTreap发现TLETLETLE的死死的然后开始写7KSplay7KSplay7KSplay然后卡了一个世纪。)AC Code\mathcal AC \ CodeAC Code#include<bits/stdc++.h>#define maxn 200005#define rep(i,j,k) for(int i=(j),LIM=.原创 2020-07-27 09:37:18 · 405 阅读 · 0 评论 -
sort(区间异或,区间排序,区间或,区间与,Trie树合并,Treap)
看标题就知道是大工业题四种操作(标题前四个短语)求最后的序列。n≤1e5,v≤232n \leq 1e5 , v \leq 2^{32}n≤1e5,v≤232考虑只有排序:发现有序的一段可以直接用一个01trie01trie01trie树来存储,trietrietrie树上字典序从小到大的值就是这一段从左到右的值。那么区间排序[l,r][l,r][l,r]时就相当于把这个区间[l,r][l,r][l,r]的所有数字放到一个trietrietrie树T1T_1T1里面,用一个三元组[l,r,T1原创 2020-07-25 17:58:57 · 677 阅读 · 0 评论 -
daklqw 的 T3(点分树上数据结构优化DP)
设fxf_xfx为从第xxx个事件开始做最多的收益。那么这个dpdpdp是按照时间线从后往前的dpdpdp,求每个点的做起点的答案可以简单的在每个点初始放一个A=K=P=0A=K=P=0A=K=P=0的时间即可解决。对于两个事件之间的转移,我们只需要这两个事件在树上的距离s1s1s1,最小多走多少距离可以到达一个奖励边刷分并且走回这两个点的最短路径s2s2s2,(贪心来说,如果我们绕路,那么一定是在一个最近的奖励边上面刷分)最短路径上本来有多少奖励边ccc。那么如果这两个事件之间可以让我们移动原创 2020-07-12 17:43:26 · 594 阅读 · 1 评论 -
仙人掌、圆方树、支配树、舞蹈链作业(上)
[APIO2018] Duathlon 铁人两项求有多少个三元组(s,c,f)(s,c,f)(s,c,f)满足s,c,fs,c,fs,c,f互不相同,而且在给定的图上存在一条从sss经过ccc到达ttt的简单路径。建出圆方树,两个圆点s,fs,fs,f可以选择的ccc为路径中所有的点双中的点,定义方点的权值为其所代表的点双的点数,圆点的权值为−1-1−1,那么两个圆点可以选择的点数就是路径上的权值和(因为sss和fff是圆点,所以c=sc=sc=s或ttt的情况是被减去了的),反过来dpdpdp每个点被原创 2020-06-15 18:03:47 · 263 阅读 · 0 评论 -
字符串作业(下)
完全做不动啊啊啊啊啊啊啊CF590E Birthday给定 nnn 个仅包含 a,ba,ba,b 的字符串。你需要去掉尽可能少的字符串,使得剩下的字符串中不存在某一个串是另一个串的子串。ACACAC自动机上路径压缩求出DAGDAGDAG,再传递闭包后求最长反链。拆点构图后求出最小链覆盖和方案。通过最小链覆盖构造出最长反链。AC Code\mathcal AC \ CodeAC Code#include<bits/stdc++.h>#define maxn原创 2020-06-11 22:42:22 · 532 阅读 · 0 评论 -
字符串作业(上)
「雅礼集训 2017 Day7」事情的相似度求区间[l,r][l,r][l,r]内两个前缀s[1..a],s[1...b](a,b∈[l,r],a≠b)s[1..a],s[1...b](a,b\in [l,r],a\neq b)s[1..a],s[1...b](a,b∈[l,r],a=b)的最长公共后缀长度的最大值。后缀自动机,用LCT\texttt{LCT}LCT维护fail\texttt{fail}fail树。离线,从前到后每次加入一个前缀,将这个前缀在后缀自动机上的点accessaccess原创 2020-06-11 17:32:06 · 345 阅读 · 0 评论 -
可持久化作业(下)
这篇原题比较多[十二省联考2019]异或粽子nnn个数,两两异或得到n(n−1)2\frac {n(n-1)}22n(n−1)个值,求前kkk大的值的和。O(klogk+nlogn)O( k\log k + n\log n)O(klogk+nlogn)做法:对于ai∧aj,ai<aja_i \wedge a_j , a_i < a_jai∧aj,ai<aj,我们维护对于每一个aia_iai和他异或值最小的aja_jaj,然后构成了nnn对(ai,aj)(a_i,a原创 2020-06-09 22:38:55 · 234 阅读 · 0 评论 -
可持久化作业(上)
全序开题准备打假A.CF757G Can Bush Save the Day?树上动态求pl...prp_l...p_rpl...pr到xxx的距离和,支持交换px,px+1p_x,p_{x+1}px,px+1可持久化点分树,答案为第rrr个版本上点分树的答案减去第l−1l-1l−1个版本上点分树的答案,修改就是对第xxx个版本的单点修改。因为可持久化需要把到儿子的链接全部复制(如果你写自底向上的点分树也一样需要把儿子到父亲的链接全部修改),所以儿子个数太多可持久化复杂度就没有保证,需要三原创 2020-06-09 11:01:23 · 354 阅读 · 0 评论 -
Bohemian Rhapsody(指针版LCT)
这个。缩点相当于把树上一个路径上的边权从1变成0,因为只需要最后输出答案,实际上一个l,r,u,vl,r,u,vl,r,u,v就是从左到右lll时刻到rrr时刻u,vu,vu,v之间的边被缩起来了,考虑把缩起来的路径,看做路径加一,我们维护每条边的贡献(szx∗(n−szx)sz_x * (n-sz_x)szx∗(n−szx)),那么答案就是值为000的路径贡献和,因为000一定是路径上的最小值(最小值不一定是000),所以我们维护最小值所在位置的贡献和,和最小值即可维护答案。写LCT O.原创 2020-05-20 20:56:31 · 291 阅读 · 0 评论 -
JOISC 2020 Day1 T3 扫除(线段树分治+线段树)
题目如果只有往右扫的操作,那么操作的顺序就不重要了,那么一个点往右移动只在于能包含他的最能往右的操作。如果还有往上扫的操作,那么一个高度为lll的往右扫的操作,实际上只能把还没被扫出范围的点往右移,注意到被扫出范围的点一定是[1,x][1,x][1,x]范围内的点(可以通过按顺序操作线段树维护),那么这个右扫的实际作用范围就是横坐标为[x+1,n−l][x+1,n-l][x+1,n−l]的点。把所有横向操作的[l,r],h[l,r],h[l,r],h即横向的影响范围和高度预处理出来后,那么对于横向的操原创 2020-05-16 17:34:41 · 503 阅读 · 0 评论 -
Cactus(动态开点Trie,全局加1)
一圈的点分为孩子和父亲,对每个点儿子维护一个集合,就是要支持插入、删除、全局加一和查询全局异或和。从低位到高位建trie,那么全局加一的时候,实际上就是交换左右子树并递归左子树,查询全局异或和可以顺便完成。相当于特殊对待父亲即可。AC Code\mathcal AC\ CodeAC Code#include<bits/stdc++.h>#define maxn 500005#define S 405#define mod 1000109107#defin.原创 2020-05-14 15:14:00 · 676 阅读 · 1 评论 -
UOJ#268. 【清华集训2016】数据交互(树链剖分套线段树套set,动态DP)
题目细节过多。一对路径相交当且仅当一个的lcalcalca在另一条路径上。所以我们如果询问一条路径相交的其他路径的权值和。把其他路径p=(u,v)p=(u,v)p=(u,v)的lcalcalca的vala+=wpval_a+=w_pvala+=wp,[u,lca)和(lca,v]的valb+=wp[u,lca)和(lca,v]的val_b += w_p[u,lca)和(lca,v]的valb+=wp那么询问路径(x,y)(x,y)(x,y)的权值和就是valb,lca(x,y)+vala,原创 2020-05-13 18:36:22 · 312 阅读 · 0 评论 -
操作最大子段和(线段树简单(毒瘤)操作,计算几何,差分约束)
题意:一次操作可以将序列中一个位置的值−−--−−求 对于1≤i≤K1\leq i \leq K1≤i≤K,iii次操作能造成的最小的最大子段和, 的和。序列长度n≤1e5n\leq 1e5n≤1e5,K≤1e13K \leq 1e13K≤1e13。问题转化:假设最大子段和为xxx,那么对于i<ji<ji<j连边(i→j)(i\rightarrow j)(i→j)权值为xxx。对于(i→j)(i\rightarrow j)(i→j)连边权值为aia_iai那么111到n+原创 2020-05-11 15:00:31 · 261 阅读 · 0 评论 -
黑白树V2
题目1.设每个点的权值为u−fauu-fa_uu−fau,那么两个黑点的贡献就是他们到根的链并的权值和,可以通过链加求链和解决询问和单点修改。2.对于子树修改,先对于这个奇数距离,开两个数据结构分别维护深度为奇数和深度为偶数的,那么就是子树翻转加上链加,可以再计算白点的链和来实现子树翻转标记。3.注意需要求子树内黑点个数。4.其实不是很长,只是询问修改操作很多而已。AC Co...原创 2020-05-06 16:20:36 · 246 阅读 · 0 评论 -
Nauuo and ODT(LCT维护连通块)
题面思路简单颜色数∗路径数−∑c是一种颜色不包含c的路径数颜色数 * 路径数 - \sum_{c是一种颜色} 不包含c的路径数颜色数∗路径数−∑c是一种颜色不包含c的路径数所以我们考虑颜色ccc,我们把所有不是颜色ccc的点都看作黑色,否则是白色。所以不包含ccc的路径数是黑色连通块的大小平方和。考虑我们用LCT维护黑色连通块。发现当一个点的颜色改变时会有O(出度)O(出度)O(出...原创 2020-05-06 15:55:04 · 421 阅读 · 0 评论 -
Codechef Union on Tree(点分树,虚树)
建虚树。然后在虚树上求出每个点最多可以往外拓展多少距离(意思就是可以由其他点拓展到这个点之后继续拓展)。那么按照这个定义我们可以得到:一个点如果被覆盖,那么一定可以覆盖他的点在虚树上是一个联通块。因为树上连通块满足点数-边数=1。那么我们把每个点可以覆盖的点数相加,再枚举每条边,减去边的两个点都能覆盖的点数,那么考虑一个被覆盖的点,能覆盖他的那个联通块会刚好计算了它一次。那么这样就...原创 2020-05-06 12:47:36 · 338 阅读 · 0 评论 -
数列修改(线段树,前缀取最大值)
#include<bits/stdc++.h>#define maxn 500005#define LL long long#define inf 0x3f3f3f3f3f3f3f3fllusing namespace std;struct tag{ LL a,b,c;//b: gc tag(LL a=0,LL b=0,LL c=-inf):a(a),b(b),c...原创 2020-05-06 12:32:51 · 356 阅读 · 0 评论 -
CF757G Can Bash Save the Day?(可持久化点分树)
题目这个题在CF上跑了15min才跑出来、、真就可持久化呗。考虑求一个点到一个点集的距离和。可以用动态点分治也就是点分树来维护点集加删点和询问操作。对于这个题,差分一下变成:多次询问前1...r1...r1...r个组成的点集到一个点的距离。那么就可以可持久化点分树维护1...r1...r1...r的每个版本的点分树。对于修改操作,发现其实就是对于xxx这个位置的单点修改,后面的版...原创 2020-05-03 20:16:29 · 325 阅读 · 0 评论 -
ROI2017 学习轨迹(转化,线段树,单调栈,性质挖掘)
题目AC Code\mathcal AC \ CodeAC Code#include<bits/stdc++.h>#define maxn 500005#define LL long long#define lc u<<1#define rc lc|1#define inf 1e17using namespace std;int ...原创 2020-04-29 11:52:34 · 308 阅读 · 0 评论 -
JOISC 2016 回转寿司
题目分块题都先考虑一个操作:如果每次操作都是[1,n][1,n][1,n],那么我们建一个大根堆,每次删除最大值,再把AAA塞进去即可。再考虑一个操作:操作完之后要根据堆和初始的数组更新出现在的数组。看一行代码:for(int i=st[id];i<=ed[id];i++) q[id].push(a[i]),a[i]=q[id].top(),q[id].pop();所以我...原创 2020-04-29 11:49:40 · 605 阅读 · 0 评论 -
Arithmetic(线段树维护历史版本和)
题意:一个多重集合的价值为将其变为公差为ddd(将在第一行输入)的等差数列需要插入几个数字(无法实现价值为0)。多次询问l,rl,rl,r,求[l,r][l,r][l,r]的子区间的价值和。序列长度3e53e53e5,数字大小和d≤1e7d\leq 1e7d≤1e7首先对于r′>rr'>rr′>r,lll使得[l,r][l,r][l,r]是最长的可以实现的区间,l′l'l′是...原创 2020-04-29 10:11:08 · 1486 阅读 · 0 评论 -
UOJ #33. 【UR #2】树上GCD
题目先求得GCD是iii的倍数的点对数再反演。用长链剖分求出子树内各个深度的节点个数,然后在合并子树的时候统计答案。先求出深度小的子树vvv的每个iii的倍数的点数,再O(maxdepv)O(maxdep_v)O(maxdepv)枚举iii,在之前的子树中求出iii的倍数的点数,然后乘起来即可。在之前的子树中可以如果i>Si>Si>S就暴力,i<Si<Si&...原创 2020-04-28 14:51:14 · 408 阅读 · 0 评论 -
Codeforces 1034D Intervals of Intervals
题目二分被选中的区间价值的最小值MMM。考虑求出对于每个RRR最大的LLL使得[L,R][L,R][L,R]的价值≥M\geq M≥M发现这个最大的LLL随RRR递增而单调递增。所以就在移动最大的LLL和RRR的时候同时维护[L,R][L,R][L,R]的价值即可。R−1→RR -1\rightarrow RR−1→R的时候,把R的区间插入ODT(珂朵莉树),那么就会总共出现O(n)O(...原创 2020-04-27 22:09:35 · 164 阅读 · 0 评论 -
BZOJ 2658: [Zjoi2012]小蓝的好友(Spaly)
题目考虑从上往下扫,维护一排点分别表示第iii列已扫过的最低资源点,按这些点的纵坐标维护笛卡尔树,纵坐标越低优先级越大,那么我们的矩形下边界在扫描线时的答案就是每个点的左范围×\times×右范围×\times×深度的和,维护这一排点需要满足深度的性质,所以要用SpalySpalySpaly来把每个新出现的资源点旋上去,因为数据随机,复杂度为O(nlogn)O(n\log n)O(nlogn)...原创 2020-01-22 19:54:42 · 229 阅读 · 0 评论 -
AC自动机九连测
T1:病毒侵袭T1:病毒侵袭T1:病毒侵袭AC Code\mathrm{AC \ Code}AC Code#include<bits/stdc++.h>#define maxn 100005#define maxc 95#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)#define per(i...原创 2020-01-20 22:36:13 · 205 阅读 · 0 评论 -
计算(线段树维护DP)
AC Code\mathrm {AC \ Code}AC Code#include<bits/stdc++.h>#define maxn 500005#define maxv maxn * 4#define mod 1000000009#define lc u<<1#define rc u<<1|1#define rep(i,j...原创 2020-01-02 21:16:49 · 194 阅读 · 0 评论 -
二维恶心强制在线卡空间数点(主席树+KD树)
为啥要主席树加KD树?因为这个恶心出题人强制在线卡空间卡时间。主席树处理询问333KD树处理=1,2=1,2=1,2勉强卡过时限。#include<bits/stdc++.h>#define maxn 800005#define Ct const#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)using n...原创 2020-01-02 20:26:34 · 511 阅读 · 1 评论 -
lost my music(二分弹凸包+可回退化栈)
n<=5e5n<=5e5n<=5e5首先你得知道这个题如果是一个序列那就是斜率优化的模板题,维护下凸壳即可。我们可以想到一个极其暴力的算法:在树上走一步相当于在凸包上加入一个点,需要先弹栈。回溯的时候就把弹掉的栈给回退就行了。这是O(n2)O(n^2)O(n2)的,因为凸包的复杂度是均摊的,不支持可持久化和可回退化。但是栈支持。所以只是因为凸包的删点次数太多了我们才...原创 2019-10-31 15:01:40 · 222 阅读 · 1 评论 -
BZOJ 3678 wangxz与OJ(离散化Treap)
某天,xmyxmyxmy神犇来到了一个信息学在线评测系统(OnlineJudge)(OnlineJudge)(OnlineJudge)。由于他是一位哲♂\text{♂}♂学的神犇,所以他不打算做题。他发现这些题目呈线性排列,被标记为1−>n1->n1−>n号,每道题都有一个难度值(可以<=0<=0<=0)。他决定与这些题目玩♂\text{♂}♂耍。 1.1.1....原创 2019-10-20 19:21:08 · 127 阅读 · 1 评论 -
LOJ #3053. 「十二省联考 2019」希望(长链剖分+可回退化后缀修改数组)
题目此题是我做过最难的长链剖分/数据结构题。没有之一。紫荆花之恋也太水了吧,xmy每天没事就写一发紫荆花之恋,wk表示这太简单了,每天没事就该写一发Hope1.出题人所说的52pts52pts52pts暴力分。容易发现对于每一组合法的救援范围,在救援范围内满足条件的点uuu,构成了树上一个连通块。但是这一组范围只能被计算一次。利用树上一个连通块中的点和边满足点数-边数 = 1的性质,...原创 2019-10-12 16:32:27 · 596 阅读 · 0 评论 -
后缀自动机的妙用
1.当串的长度较小的时候(<10000) 而询问某子串在另一串出现次数的较多,可以考虑遍历全部子串(离线只需O(n^2)),优于询问一个一个子串(O(q*len))2.当串的长度较长时,而询问某子串在另一串出现次数的较少,可以考虑将串的每个前缀在另一串的right集合记录下来,因为子串一定是原串一个前缀的后缀,那么问题就转化为查询len(原串长度)个子串中的后缀,对于后缀自动机,如果查的...原创 2018-01-07 11:29:10 · 356 阅读 · 0 评论 -
矩阵乘法套线段树(动态最大子段和问题)
一个新套路,利用矩阵能将一些复杂的线性关系转换为一次矩阵乘法。求解只需求区间积。采用线段树(所以需要满足结合律)更奇特的是你可以重载矩阵乘法时内部单个元素的乘法和加法(比如说改成取max之类的)只要重载之后仍然满足结合律我自己想了一个判断方法。要A*(B*C)=(A*B)*C令A*(B*C)=D,(A*B)*C=E有D=EDij=Eijsigma(sig...原创 2018-02-27 16:22:25 · 579 阅读 · 0 评论 -
序列一次差分
有很多题会有这样的题面:两段序列相似,当且仅当这两个序列长度相等并且其中一段整体加上(减去)一个数字等于另一段。然后不难发现这等价于两个序列,a1,a2,a3,a4,a5,a6...b1,b2,b3,b4,b5,b6...有a1-a2=b1-b2,a2-a3=b2-b3....然后一次差分,再用后缀数组之类的维护经典题是POJ1743还有一类变式,CodeForces - 232D 最需要注意的是...原创 2018-03-01 09:18:25 · 1465 阅读 · 0 评论 -
K-D Tree
就是用一些的方法把平面按点分成若干块,方便你剪枝(这思路真暴力)因为是剪枝暴力,复杂度是O(能过),可以拿来干超级多的事情CQOI2016 : K远点对#include<cstdio>#include<cstring>#include<cctype>#include<algorithm>#include<queue>#incl...原创 2018-03-15 14:35:42 · 279 阅读 · 0 评论 -
一种按点划分,对于随机数据表现良好的非常规二维数据结构(二维KD树)
二维KD-Tree是一种将平面用一种玄学的方式分割成多份的数据结构其操作功能强大1:找最近||最远点,利用矩形区域计算最大最小可能值来剪枝,随机数据期望复杂度O(logn) ,构造数据。。。。。。不过可以用来优化求min/max之类的DP,DP式中数据应该近乎随机。2.覆盖关键点的二维线段树问题:如 BZOJ4154——IPSC2015 Generating Synergy当问题可以转化为二维平面...原创 2018-03-15 16:13:27 · 244 阅读 · 0 评论 -
可修改的哈希
如果在一个字符串中要找是否存在长度为n的回文串可以manachar但是更好打的方式是直接HASH可是,这个HASH需要算O(len)个长度为n的字符串的HASH值如果暴力,已经到了O(n^2)的级别那么考虑一下,如何简化。计算HASH的O(n)是不能省的那么不难想到利用前面串的结果来巧算后面串的HASH值。可是,HASH之所以出名还因为他的不可逆性!考虑一下这个HASH函数 HASH( s ) =...原创 2018-03-02 20:29:09 · 815 阅读 · 1 评论 -
替罪羊树SCT
照着指针版的打了个数组版的,发现自己上了一节C++语法课。重构什么的,最难在于找出深度最小的需要重构的节点,毕竟多写一个函数不太优雅,数组又不像指针那么方便直接修改。如果你要传回一个变量的地址(因为你直接修改这个地址ch等等就直接跟着改了,十分方便)函数不能写 int&得写int *...............删除还是不要重构,太浪费了。。。。。。#include<cstdio&g...原创 2018-03-12 19:57:50 · 210 阅读 · 0 评论 -
线段树合并
表示完全无法理解,码了一个超水模板题后感觉是主席树的逆运算?(楼主又在瞎BB了)BZOJ 2212DescriptionByteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some interesting features: The tree consists of straight br...原创 2018-03-13 11:23:59 · 374 阅读 · 0 评论