P10612 Box of Mirrors 题解
我发现我贪心之类的什么都不会,因此我们用一点点置换群知识暴力构造!
由于光路可逆,因此我们只保留一边的光线和对应的出口。我们保留左边和下边的光线。我们经过观察发现,镜子只会使光向右和向上走,并且每个光线恰好对应一个出口。
我们可以用一个
继续观察,考虑放置镜子的实质。实际上就是交换进入格子的两束光的终点。但是有一个问题,直接放置可能会改变之后可以进行的操作。
考虑样例里的这张图:
如果你先放置最后一行第二个镜子,那么放置第一行第二个镜子的效果就变成了交换光线
注意到光线只会往右上方走,因此只会对右上方的镜子效果造成影响。我们从右上角往左下放置镜子即可。
我们从第一行开始,从上到下,每行从右往左放置镜子。我们发现每行实现的对换形如
因此,我们考虑的就是通过若干的轮换的复合能否构成
考虑对这个置换进行轮换分解。假设目前是第
首先我们把
此时我们有两种选择,一种之把
另外一种则是把
此时我们可以把
考虑如何决定选择哪种操作。贪心地想应该选择两个数中比较大的那个。
- 如果比较大的是
,那么显然多拿没坏处。如果接下来的数比自己小不影响,比自己大的话就可以创造更多连续取数的机会。 - 如果比较大的是
,那么 的前一个数比 大,那么拿走不影响。否则也可以创造更多连续取数字的机会。
但这只是感性理解。我们考虑严格证明。
首先考虑若干个形如
先都拆出来一个
把中间两个轮换都转一下,然后拆出来
中间两个轮换已经没有相交部分了,我们交换之后和两边的轮换合并起来。注意中间两个轮换省略号省略的内容就是在
我们发现,如果两个轮换有相交,我们可以挑出两个相交的元素并使得这两个元素最终只在其中一个轮换中存在。这样化简之后的最坏情况就是相邻两个轮换只有一个元素相交。此时我们考虑把这些轮换拼起来:
注意到前后两个省略号一个是前面一部分小于
我们再加入一个数试试:
我们发现,最后的结果一定是
如果不相交的话,相当与被轮换分解时拆成了两个轮换了。
接下来我们证明,此类轮换一定可以通过上述方法分解出来。我们使用归纳法。
首先考虑轮换内部只包含
考虑有
注意到我们的贪心策略的停止条件实际上就是最后的数大于前面的数。因此我们把前面的数转到后面之后仍然能保证单调递减。此时变成了大小为
代码和勘误稍后放在这里。