T1
我们可以考虑最小割树的逆过程。
然后根据最小割情况复原出最小割树。
每次找到当前集合中最小的割。
然后用并查集链接割大于最小的割的情况。
这样就可以做到分割两个集合了。
递归下去判断是否有解即可。
T2
考虑做树形(dp)。
设:
(f[x][i])为(x)的子树中经过了(i)个点直径的一个端点是(x)的最小代价。
(g[x][i])为(x)的子树中经过了(i)个点的最小边权和。
(h[x][i])为(x)的子树中经过了(i)个点直径的任意端点均不是(x)的最小代价。
这样就是一个(O(n^2))的(dp)了。
六种转移不再赘述。
T3
直接(hash)就行了。
没啥好说的。
(hash)有一些技巧。
如果是双向加入的话,从零点开始双向维护,正反两中读法可以直接用(p,p^{-1})做两种情况的进制。
这样后一种情况只需要乘(p^{len})就可以复原出(hash)值,而维护却可以(O(1))的维护和计算。