「考试」省选76

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)\)的维护和计算。

posted @ 2020-04-21 21:40  Lrefrain  阅读(125)  评论(0编辑  收藏  举报