Sone0
DescriptionReference
有一颗n个节点的树,每个节点有编号与权值。有m次操作,每种操作都有独特的编号。
编号为1的操作,会切断当前树上存在的一条边,并新加一条边,保证操作完成后仍然是树。
编号为2的操作,会改变这颗树的根节点(初始根节点为1)。
编号为3的操作,会给树上一条路径上所有点的权值都增加x。
编号为4的操作,会对树上一条路径上点的权值信息进行轮换:
如果是对
j
j
j 到
k
k
k 这条路径操作,从
j
j
j 走到
k
k
k 的遍历序列是
a
1
∼
p
a_{1\sim p}
a1∼p 。
则
a
1
a_1
a1 的权值改为
a
2
a_2
a2 的权值,
a
2
a_2
a2 的权值改为
a
3
a_3
a3 的权值……
a
p
−
1
a_{p-1}
ap−1 的权值改为
a
p
a_p
ap 的权值,
a
p
a_p
ap 的权值改为
a
1
a_1
a1 的权值。
编号为5的操作,会对树上一条路径上所有点的权值都开方(下取整)
编号为6的操作,会询问树上一条路径上所有点的权值和。
编号为7的操作,会给定两个常数
p
p
p 和
q
q
q 。
你需要求出两个正整数
u
u
u 和
v
v
v,对于给定路径上任意两点权值
x
x
x 和
y
y
y ,需要满足
x
/
p
<
u
/
v
<
y
/
q
x/p<u/v<y/q
x/p<u/v<y/q 。
如果无论如何都满足不了这个条件,那么需要满足给定路径上存在两点权值
x
x
x 和
y
y
y,满足
p
/
x
<
v
/
u
<
q
/
y
p/x<v/u<q/y
p/x<v/u<q/y。
如果还是无论如何都不可能满足,那么该操作为非法操作。
你需要求出
u
u
u 和
v
v
v ,并最小化
v
v
v 。对于非法操作输出
−
1
-1
−1。
编号为8的操作,会询问树中一个子树的大小。
好SAO啊
Task1
O
(
n
2
)
O(n^2)
O(n2) 暴力
Task2
O
(
n
log
n
)
O(n\log n)
O(nlogn)
Task3 开方是类似于分块的做法,树上连分块都省了。暴力即可。
O
(
n
log
n
)
O(n\log n)
O(nlogn)
Task4 开方的时候 最大值等于最小值 或者最大值和最小值的差为
1
1
1 就打标记,然后退出。
Task5 类欧
Task6 Splay
Task7 暴力链表 or LCT
Task8 树剖
Task9 Euler-Tour-TreeReference是用一个 splay 维护欧拉游览序(实际上被省略成括号序列)的东西
兹磁子树操作、链操作、Link&Cut、换根。
换根:access,左翻翻,右翻翻;到根路径上点的子树打标记,下次遇到就翻翻
emm 但是跟这道题没有什么关系。我只是看到就顺便去翻了翻。
我们知道:没有 Link&Cut 的情况下,就算有换根也能够维护子树大小。
方法:不真正地换根,知道根是哪个就可以。
Task10 LCT
Task11 把权值和形态用两个 Splay 分别维护。
Task12 换根+Link&Cut 的情况下,维护子树大小的套路是维护虚子树信息Reference。
Access 的时候虚实切换。然后修一下, Pushup 即可。
Link(x,y) 的时候, y 的 Size 和 y 的祖先的 Size 都会变
方法很暴力,Link(x,y){ Makeroot(x), Makeroot(y), LINK(x,y), Pushup(y); }
(中间的 LINK(x,y) 就是指 Fa[x]=y, Siz[y]+=Siz[x] 之类的东西啦。)
如果没写过的话推荐一道例题 [BJOI2014] 大融合 (ps BJOI2014 的板子好多啊。。
Task13 开方怎么做呢?……思路不变。把相同的段一起搞?
懒的写就跟前面的一样啦。
有根树LCT
裸题啊 弹飞绵羊大家都写过。。
需要注意的:Cut(u,Fa) 的时候把 Fa 转上 Splay 顶再 Cut
Cut(u,Fa){ Access(u), Splay(Fa), CUT(u,Fa), Pushup(Fa); }
LCT维护图上信息
树连通性
不管用不用支持删边都是裸题。
BZOJ2049。
图连通性,不支持删边Reference
刚好看到了就顺便写一下吧。
首先要想到一个套路啊 并茶几维护缩点。
并茶几一号 维护两个点是否联通
每次 Link 如果两个点不是联通的 就直接连
如果两个点是联通的
并茶几二号 维护两个点是否双联通
没有就连+缩点
有就缩点
图连通性,支持删边
这东西就是动态图(连通性),loj[1][2] 和 luogu 上面都有板子题。
离线
线段树分治可以秒离线。
每条边只在一段区间的时间内会存在
线段树的每个节点维护一个 vector
维护覆盖这个点的边存在的时间的区间
于是用可撤销并查集维护当前连通的点
在线
我看网上题解都是被插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插
等哪天这个东西dssq+我要是没退役再补吧