ICPC World Finals 2024 Astana
E. Flipping Container
先 dfs 枚举开始的 \(O(1)\) 步操作,这时 \(x,y\) 分别有一个集合,满足可以任意做 \(x\to x+S_i,x\to x-S_i\) 操作。
然后对于 \(x,y\) 分开做,转化成一个最短路问题。可以同余最短路。
G. Kindergarten
转化一下限制,每个 \(i\) 需要满足以下之一:
- \(b_i\to i\)
- \(i\to c_i\to b_i\)。
先把所有点设成第一种,如果 \(b_i\) 没有环就做完了。但是肯定有环,所以就要选一些点变成第二种限制(称这种操作为反转)。
下面建一张图,连 \(i\to b_i\) 为黑边,\(i\to c_i\) 为红边。
枚举环上的一个点 \(u\),考虑 \(u\to c_u\to b_{c_u}\cdots\) 的路径,如果 \(c_u\) 不断走黑边不会经过 \(b_u\),那么就做完了(只需要反转 \(u\))。
否则,在 \(c_u\) 不断走黑边,走到某一个点 \(x\) 的时候,必须跳红边走到 \(c_x\),然后从 \(c_x\) 继续跳黑边。而 \(c_x\) 跳黑边跳到的点需要满足不能经过 \(b_x\)(这里只需要限制 \(b_x\),不需要限制 \(b_u\))。
最后我们要找的就是一个 \(\rho\) 型路径,满足:
- 环的起始位置在 \(b_i\) 的基环树的环上。
- 环的部分至少有一条红边。
- 每跳一条红边 \(u\to c_u\),接下来从 \(c_u\) 开始跳黑边,这一段连续的黑边不能经过 \(b_u\)。
枚举基环树的环上的一个点当起始点 \(u\),从 \(u\) 开始先走一条红边,然后 dfs。
dfs 过程中,我们优先考虑走黑边,如果能走回 \(u\) 且不经过 \(b_u\),那过程就结束了。
否则,红边 \(c_u\) 一定走进了 \(b_u\) 的子树里。
此时从 \(c_u\) 开始继续走黑边,如果走到一个点 \(x\),满足 \(c_x\) 跳出了 \(b_x\) 的子树,就结束了。
dfs 过程中,如果找到一个存在红边的环,就可以构造了:将所有 \(u\to v\) 的红边的 \(u\) 反转,其他不反转。
其他题摆了