退役前的做题记录(CF VP)

代码可以上CF看我的提交记录。。(反正我这么菜肯定没人会看我的代码。。)


1168C And Reachability

对于数列中每个数\(a_i\)求出它后面(包括它自己)第一个第\(j\)位是\(1\)的数的位置,记为\(nxt(i,j)\)

这个玩意可以倒着求,可以用\(nxt(nxt(i,j),k)\)更新\(nxt(i,k)\),处理出这个数组就可以\(O(\log a)\)回答询问了。

时间复杂度为\(O(n \log^2 n)\)


1168D Anagram Paths

题解里说可以动态DP搞,然而并不会。。

显然如果存在两个叶节点的深度相同,那么无解。

记整棵树深度为\(h\)\(maxcnt(x,c)\)表示以\(x\)为根的子树内所有从\(x\)出发到叶节点的链中字符\(c\)出现次数的最大值。那么有解的充要条件则是对于任意\(x \in [1,n]\),满足\(\sum_{i=0}^{25}maxcnt(x,i) \leq h-dep(x)\)

有一个结论,如果一棵树的所有叶节点的深度相同,在仍然满足上一条件的前提下,尽可能多地删除只有一个儿子的节点,最后得到的新树的深度是\(O(\sqrt n)\)的,因为每个深度的节点数都不相同。

所以建出新树并处理出初始的\(f\)数组后,每次询问暴力爬链修改就好了,因为是二叉树所以时间复杂度有保证,为\(O(n \times 26 + n \sqrt n)\)


1168E Xor Permutations

不太看的懂官方题解。。

先咕了,咕咕咕。。


1149B Three Religions

\(f(i,j,k)\)表示三个串分别匹配到了第\(i,j,k\)个位置时,在文本串中匹配的最后一个位置的最小值。考虑转移,我们可以枚举文本串的最后一个位置是和哪个串匹配的,即通过序列自动机从\(f(i-1,j,k),f(i,j-1,k),f(i,j,k-1)\)转移。

在修改的同时进行如上的转移就好了,时间复杂度为\(O(q \times 250^2)\)


1149C Tree Generator™

把左括号看作\(1\),右括号看作\(-1\)

答案即为连续一段的和的相反数加上紧接在它后面的连续一段的和的最大值,可以使用线段树大力维护,时间复杂度为\(O(n + q \log n)\)

官方题解的做法是转化成前缀和再做。


1149D Abandoning Roads

可以发现最小生成树要求我们尽可能多地选取边权为\(a\)的边。

我们考虑在图上加入所有边权为\(a\)的边,这样图会形成若干个连通块。我们需要找一条\(1\)\(i\)的路径,满足不能经过一条边权为\(b\)的边,它的两个端点在同一连通块中,也不能离开一个连通块后再回来。

这样直接状压+Dijkstra的时间复杂度为\(O(n^2 2^n \log n)\),显然不能接受。

但是我们注意到,如果一个联通块的大小\(\leq 3\),那么最短路一定不会离开这个连通块后再回来,即我们无需状压大小\(\leq 3\)的连通块。通过这个结论我们可以将时间复杂度优化到\(O(\frac{1}{4}n^2 2^{\frac{n}{4}} \log n)\)


1149E Election Promises

一个想法是把原图分为若干个独立集,独立集内部不会产生影响,然后会发现借助\(SG\)函数划分的独立集有很多很好的性质,具体的可以看这一篇博客。

orz gcz

猜你喜欢

转载自www.cnblogs.com/ErkkiErkko/p/10950311.html