将剩余赠送者和接收者分别按编号排序,并匹配相同排名的人。初始时每个人与自己匹配,因此合法。维护匹配始终合法,且每个匹配接收者的编号不超过赠送者原来的编号。
对赠送者,设匹配接收者为,前一个剩余接收者为,若不存在则令。若,称为受阻赠送者。第一个赠送者始终受阻。选择最右边的受阻赠送者。
回复满足,所以不会在左边。删除和后,它们之间的赠送者的匹配各向左移动一个接收者。右边没有受阻赠送者,因此移动后仍满足下界。接收者编号变小,也保持满足上界。匹配继续合法,从而对于交互器的任何选择,每轮都能成功。
为每个剩余赠送者维护
排名从1开始。合法匹配保证,受阻赠送者恰好满足。删除赠送者与接收者后,恰好将且的赠送者的减1。因为的赠送者必然在右边,两个排名变化相互抵消。
按赠送者原始编号分为大小为的块。每块按排序,用懒标记线段树维护前缀减1和最小值。对选中赠送者所在的块,下放懒标记、直接更新并重建。对其右边的完整块,更新满足的前缀。维护最小值为0的块的集合,即可找到最右边的0。
时间复杂度为,空间复杂度为。实现取。当时,可直接用数组维护有序匹配,得到算法。当时,可用两个使用状态位掩码,枚举交互器所有回复进行极小极大搜索。
Solution written by GPT6.1