**T1
艹想都想完枚举最小点在的连通块容斥了居然没意识到这是个dp…
肯定是太困了没意识到
那么对于一个
3
n
3^n
3n的做法就是枚举子集容斥
这里提供一种区别于题解的做法
我们用
f
[
m
a
s
k
]
f[mask]
f[mask]表示在
m
a
s
k
mask
mask这个状态中的点均已联通的方案数,并且保证第一个点与之是联通的,即状态中不包括第一个点
容斥时我们只需要枚举一个集合,相当于枚举的是与
1
1
1相连的集合
然后可以发现,这就是一个子集卷积了,因为这里没有限制的
于是就可以愉快地
2
n
n
2
2^nn^2
2nn2了
****T2
不好意思不会…以后补以后补
T3
最可做的一题
首先可以知道,对于一个点被删去后,一定是在他最大的那棵子树中找一个子树扔到他最小的那个子树里
取的一定是最靠近
(
t
o
t
[
x
]
−
t
o
t
[
y
]
)
/
2
(tot[x]-tot[y])/2
(tot[x]−tot[y])/2的值,即前驱后继
那么如果最大的子树不是包括根的那棵,那么是主席树简单问题
否则我们发现,我们要去掉的是他到根以及他的子树
这里我sb了…写了一个智障做法.
先单独开一棵主席树维护每个点到根的信息
然后我们开一棵线段树,按DFS序从前往后以及从后往前分别扫一次
其中每个点只在他的子树全部访问完后才加入线段树
这样一个点在某次扫描的时候计算的只会是DFS序在他前/后且不包括到根的点的贡献
那么就可以愉快
n
l
o
g
n
nlogn
nlogn了
虽然感觉这种做法应用还是可以很广的