D
合法的 beautiful 串只能是 abc 排列组合后的循环。
E
把给的区间 [ l , r ] [l, r] [l,r] 变成 [ l , r − 1 ] [l, r-1] [l,r−1],那么 1 连通 m 等价于选定的区间覆盖 [ 1 , m − 1 ] [1, m-1] [1,m−1]。利用双指针用线段树做区间覆盖即可。
F
显然一开始加进去的边若不构成环则一律 YES。考虑开始出现环的情况,这时环一定长在树上(即连接了树上的两个点)。
如果环长在树上,那么可以用类似于求 LCA 的技巧判定该环的边的 xor 是否为 1。如果是,那么可以加入该边,然后就变成了一个环套树。
如果环不长在树上呢?我们可以证明这种情况一定不合法。
考虑某个环套树。如果向其再加任意一条边,使得该边横跨了环套树上两个不同的树,那么一定非法。证明很简单:如果新加的这条边形成的环的 xor 是 1,环套树的环的 xor 也是 1,那么两个环 xor 起来是 0,但这个 0 代表的部分仍然是个环!
如图所示。
因此只需要恰当的维护这堆树,以及环套树上的树即可。
一种做法是:把一开始的树当作骨架(可以离线做,从而把所有的树都弄出来),如果树上的某条路径变成了环的一部分则把整条路径上的边都染色,那么一条非树边 ( u , v ) (u, v) (u,v) 没有横跨任何环套树上两个不同的树,当且仅当路径 u ↔ v u \leftrightarrow v u↔v 没有经过任何被染色的边。
这里染色可以暴力染,因为一条边至多被染一次。