
数据结构-LCT
Endless_Way
这个作者很懒,什么都没留下…
展开
-
UOJ 207 共价大爷游长沙
LCT看见树边可以删除和加入,就会直接想到用LCT,但是如何用LCT维护如题所述的边的信息呢?考虑一个询问(u,v),如果他是合法的,那么所有(共价大爷走的)链都一定经过它。换一个角度,也就是说所有链的两个端点都一定分居这条边两侧!这提醒可以我们从端点入手,而不是边。如何判断所有所有链的两个端点是否分居两侧?用异或值!我们对于每一个加入的链,在链的两端点异或上一个随机大整数。对于询问(u,v),假设原创 2016-10-21 23:28:05 · 963 阅读 · 0 评论 -
BZOJ 2049 [Sdoi2008]Cave 洞穴勘测
LCT模板题顺便挂一个不错的LCT教程:link-cut trees#include<cstdio>#include<algorithm>#define N 10005using namespace std;struct node{ int fa, ch[2], lazy; }t[N];char s[10];int stk[N], top;void pushdown(int原创 2016-09-28 18:41:21 · 356 阅读 · 0 评论 -
BZOJ 2959 长跑
LCT+缩边双+并查集 显然如果进入一个边双联通分量,那一定能取遍所有点再出来.于是只要维护边双即可.对于加边,需要缩点,用LCT即可,判断是不是在一个边双里用个并查集就行. 此题时限比较紧.注意到在缩点之后,LCT上的操基本只有access需要查询真实父亲(因为缩点之后的点单独属于一个分量),其他操作并不需要查并查集.把这个优化掉就能过了...?#include<cstdio>#include<原创 2017-02-08 23:25:55 · 328 阅读 · 0 评论 -
BZOJ 2631 tree
LCT好智障啊,update的条件设成判null了,其实应该是判isroot的……#include<cstdio>#include<algorithm>#define N 100005#define MOD 51061using namespace std;namespace runzhe2000{ typedef unsigned uint; int n, q;原创 2017-04-22 20:00:26 · 267 阅读 · 0 评论 -
51Nod 1600 Simple KMP
SAM+LCT/树剖线段树一个点的深度就是有多少个以这个点结尾的后缀等于前缀。fail树性质不太够,不好下手,直接考虑答案的贡献。对于两个相等的区间[l,r]&[x,y]其中l#include<cstdio>#include<cstring>#include<iostream>#define N 100005#define MOD 1000000007#define A 28#defin原创 2017-04-27 23:31:05 · 564 阅读 · 0 评论 -
LOJ 6041 「雅礼集训 2017 Day7」事情的相似度
LCT+SAM+线段树问一个区间里的前缀之间的最长公共后缀,考虑SAM一发,建出反串后缀树,然后求最长公共后缀就变成求最深的LCA。直接维护区间的答案不好做,因此考虑一些离线的算法。莫队不知道能不能做,这里考虑把询问按照右端点排序,然后从左到右扫一遍。扫到i,则维护所有左端点在1~i-1,右端点在i的区间的答案。i新贡献的答案就是i和1~i-1的最公共后缀,也就是后缀树上一个点和其它一些点的最深LC原创 2017-06-24 17:34:53 · 1584 阅读 · 0 评论