环
考虑是一个环的情况,其实这个时候不管操作哪个点一个棋子都可以任意移动一步。
找到环上最大的边,我们希望将黑白移动到对应两边。
如果环长为奇数,那么我们一定能将任意棋子移动到上面,答案就是 \(Black \times White \times w\)。
如果环长为偶数,那么有贡献的只有可能是距离为奇数的一对棋了,我们必然能将他们移动到最大边的两边。
树
这一个比较难,我们不能自由选择一个点往哪一边走了。不过这个情况居然可以直接从上界进行分析,怎么会是呢?
考虑距离为奇数且颜色不同的两个点才能造成贡献,将位置奇偶性染色,我们希望把位置颜色相同的移动到一起从而取到上界。如果两个点的距离减少那必然是存在一个点度数大于 \(2\)。(注意力惊人)
考虑其充分性,我们选择该点三个子树中的一个叶子,第一次操作完后依次操作者这三个点。由于三个点中至少有一个会使得两个点距离靠近,其他点不会使得其发生改变,所以操作次数足够多的话所有颜色一定能移动到一个位置,最后再移动到最长的边旁边即可。
那么树这一块我们只剩下了链了。
一般图
链的情况感觉可能有点复杂,不妨先将一般图转化成我们已知的情况。
如果原图是二分图,那么就存在之前说过的上界,如果存在大于三度的点,那么直接取出其生成树,否则他就是一条链(之后讨论)。
如果原图不是二分图,那么一定存在奇环,取出一颗生成树,将所有点移动到一起,再转移到环上,最后用奇环把白颜色调出来,然后移动至最大权边即可,答案为 \(Black\times White\times w\)。
链
这个时候是序列上的问题了,他变成了一个 AtCoder 题。(长舒一口气)
考虑一个最终序列能被构造出来需要满足的条件:
- 在一个点上的棋子初始位置必须连续。
- 两个棋子之间的位置差和初始位置差奇偶性相同。
- 两个棋子之间的距离小于原距离。
不难发现以上满足以上条件的最终序列一定能被构造出来。
结合我们的贡献计算方式,不妨设 \(f_{i,l,r}\) 表示考虑了前 \(i\) 个位置,第 \(i\) 个位置上放了初始区间在 \([l,r]\) 的棋子。
每一次枚举下一个有棋子的位置 \(j\) 以及右端点 \(r'\),需要满足 \([r+1,r']\) 之间的棋子奇偶性相同,且 \(i-j\) 和 \(a_{r'}-a_r\) 的奇偶性相同,且 \(i-j\) 小于等于 \(a_{r+1}-a_r\)。由于所有 \(a_{r+1}-a_r\) 的和为 \(O(n)\),所以对于一对 \((i,l)\),其转移数量也只有 \(O(n^2)\),所以时间复杂度为 \(O(n^4)\)。
代码咕咕咕。