
【数据结构】可持久化数据结构
文章平均质量分 71
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【CodeForces232D】Fence
【题目链接】点击打开链接【思路要点】单独考虑长度为1的询问,显然答案为\(N-1\),否则,我们将原序列和询问序列差分,问题等价于我们需要找到原序列差分后的序列中与询问序列差分后的序列“相等”(这里的“相等”指对应位置互为相反数),且出现位置与询问位置不重合的子串个数。我们可以将原差分序列倍长,对后一半每一项取相反数,并用一个不可见字符连接两端序列,然后求解这个序列的后缀数组,并在询问时在上面二分...原创 2018-03-15 15:20:45 · 282 阅读 · 0 评论 -
【LOJ3055】「HNOI2019」JOJO
【题目链接】点击打开链接【思路要点】考虑将字符串缩成若干个相同字符的段 (cnt,char)(cnt,char)(cnt,char) ,相邻的字符不相同。考虑一个与某一个前缀匹配的后缀,若该后缀横跨了 x (x≥2)x\ (x\geq2)x (x≥2) 段,那么其对应的第 222 段至第 x−1x-1x−1 段的 (cnt,char)(cnt,char)(c...原创 2019-04-23 13:54:50 · 863 阅读 · 0 评论 -
【校内训练2019-03-26】动态半平面交
【思路要点】考虑将 pkp^kpk 的贡献拆分为 p,p2,p3,...,pkp,p^2,p^3,...,p^kp,p2,p3,...,pk 分别的贡献,每一个数若在范围内出现,对答案产生 ×p\times p×p 的贡献,重复出现统计一次。考虑询问 x,yx,yx,y ,它实际上考虑了 xxx 子树内所有深度不超过 depthx+ydepth_x+ydepthx+y 的点,因此,若将询...原创 2019-03-27 14:42:45 · 728 阅读 · 0 评论 -
【51Nod2004】终结之时
【题目链接】点击打开链接【思路要点】建出 支配树 ,剩余的操作均可以通过轻重链剖分+线段树解决。时间复杂度 O(QLog2N+M)O(QLog^2N+M)O(QLog2N+M) 。另外,等到笔者写完可持久化后才发现这个题的可持久化是假的,只需要将之前进行的操作减回去即可,这样做空间复杂度就不会高达 O(NLog2N)O(NLog^2N)O(NLog2N) 了。但可持久化的版本...原创 2018-09-20 12:35:56 · 390 阅读 · 0 评论 -
【BZOJ3653】谈笑风生
【题目链接】 点击打开链接 【思路要点】 分 bbb 是否是 aaa 祖先讨论,aaa 是 bbb 祖先时需要主席树来维护答案。 时间复杂度 O(NLogN+QLogN)O(NLogN+QLogN) O(NLogN+QLogN) 。 【代码】 #include<bits/stdc++.h>using namespace...原创 2018-09-05 19:35:53 · 292 阅读 · 0 评论 -
【BZOJ5417】【UOJ395】【NOI2018】你的名字
【题目链接】 BZOJ UOJ 【思路要点】 对 SSS 用后缀自动机建后缀树,并在其 DFSDFSDFS 序上建立主席树。 考虑一个询问 (T,ql,qr)(T,ql,qr)(T,ql,qr) ,从后到前依次考虑其每一个后缀对答案的贡献,显然对于每一个后缀 iii ,存在一个长度 lenlenlen ,当且仅当 j>i+lenj>i+le...原创 2018-09-11 14:04:31 · 669 阅读 · 0 评论 -
【BZOJ3674】可持久化并查集加强版
【题目链接】 点击打开链接 【双倍经验链接】 【BZOJ3673】可持久化并查集 【思路要点】 用可持久化线段树实现可持久化数组。 时间复杂度O(NLog2N)O(NLog2N)O(NLog^2N)。 【代码】 #include<bits/stdc++.h>using namespace std;...原创 2018-08-13 15:54:37 · 301 阅读 · 0 评论 -
【BZOJ3673】可持久化并查集
【题目链接】 点击打开链接 【双倍经验链接】 【BZOJ3674】可持久化并查集加强版 【思路要点】 用可持久化线段树实现可持久化数组。 时间复杂度O(NLog2N)O(NLog2N)O(NLog^2N)。 【代码】 #include&lt;bits/stdc++.h&gt;using namespace s...原创 2018-08-13 15:53:32 · 243 阅读 · 0 评论 -
【BZOJ5338】【TJOI2018】xor
【题目链接】点击打开链接【思路要点】对于询问1,将点按DFS序重标号,在新标号的序列上建立可持久化字典树即可。对于询问2,用可持久化字典树维护每个点到根节点路径上的点权形成的字典树即可。时间复杂度\(O(NLogV)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 100005;const int...原创 2018-06-13 10:36:47 · 303 阅读 · 0 评论 -
【BZOJ5319】【JSOI2018】军训列队
【题目链接】点击打开链接【思路要点】显然对于一个询问,我们应该将被询问的人以及询问的位置排序后一一匹配。也就是排序后求\(\sum_{i=1}^{N}|A_i-B_i|\)。由于人的位置互不相同,所以\(A\)数组是递增的,而\(B\)数组是连续的一段整数,因此\(A_i\)与\(B_i\)的大小关系只有可能由小于到大于变化一次。对原序列建立主席树,询问时在对应区间上二分出大小关系变化的位置,前后...原创 2018-05-24 15:11:46 · 914 阅读 · 0 评论 -
【BZOJ2653】middle
【题目链接】点击打开链接【思路要点】中位数相关,考虑二分答案。我们现在想要检验\(Mid\)是否能够作为中位数出现,令大于等于\(Mid\)的元素为1,其余元素为-1,我们希望求出一个左右端点都在给定范围内的区间,使得区间和最大,若这个区间和非负,那么\(Mid\)能够作为中位数出现,否则不能。这个问题等价于找到在给定范围内的左右端点,使得左端点到1的和最小,右端点到\(N\)的和最小。我们将序列...原创 2018-05-28 20:12:49 · 235 阅读 · 0 评论 -
【BZOJ4477】【JSOI2015】字符串树
【题目链接】点击打开链接【思路要点】用可持久化字典树维护每个点到根路径上字符串的字典树。询问时分别查询\(x\),\(y\)和\(Lca(x,y)\)即可。时间复杂度\(O((N+Q)(|S|+LogN))\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;const int MAX...原创 2018-04-19 20:24:46 · 248 阅读 · 0 评论 -
【LOJ3048】「十二省联考 2019」异或粽子
【题目链接】点击打开链接【思路要点】前缀和后用可持久化线段树可以计算出各个右端点对应的最优的左端点,并且可以实现在某一个左端点集合中单点删除。用堆维护全局最优值,每找到一个便将其在对应的线段树中删除即可。时间复杂度 O(NLogV+KLogV)O(NLogV+KLogV)O(NLogV+KLogV) 。【代码】#include<bits/stdc++.h>...原创 2019-06-17 20:37:59 · 325 阅读 · 0 评论