省选模拟29 题解

A. circle

容易发现,如果存在一组合法答案,那么

$k$ 个钦定点之间和 $n-k$ 个不被钦定点之间一定都是存在拓扑序的。

考虑一个不被钦定点不被删去,一定满足这个点的连边情况恰好满足在 $k$ 个点的排名上存在分界点。

上面那个条件使得不存在不被钦定点与两个被钦定点之间的环,另一种环是一个被钦定点和两个不被钦定点。

实际上还有一个条件没有用到, $n-k$ 个点之间也是有拓扑序的,所以在拓扑序上以分界点为考虑对象做一个 dp 就可以了。

B. 生成膜咒

容易发现深度可以转化为 $border$ 的个数。

考虑使用 sam 上的 endpos 集合,一个 border 出现,等价于同一个节点上两个不同的 endpos 。

由于子串的问题,可以发现这个贡献要乘一个系数。

最终的操作是:

1.查询一条链的 $(len_x-len_{fail_x})*|endpos_x|$ 之和。

2.将一条链的 enspos 加入一个元素。

因为本题并不强制在线,树剖比较好打,lct也可以实现。

C. simulate

显然最终形成的序列与操作顺序无关。

所以考虑随时保证 $[1,i)$ 中只含有数字 $0/1$ ,此时将位置 $i$ 处 $>=2$ 的数字消掉。

右侧的贡献可以直接加在下一位上。

可以发现对于左侧的贡献是找到为 $0$ 的前驱并赋值为 $1$ ,将该前驱的下一位的值 $-1$。

实际上这个操作有些类似将 $0$ 不断右移。

所以用一个单调栈维护为 $0$ 的位置,不断进行上述操作就完事了。

容易发现循环内两次操作导致栈内元素个数减少 $1$ ,所以复杂度是正确的。  

猜你喜欢

转载自www.cnblogs.com/skyh/p/12354563.html