Loading

【题解】AGC032E Modulo Pairing

常规想法是二分答案,但是感觉没前途。

首先将所有的数排序,最后一定选出来若干不小于 \(m\) 的和小于 \(m\) 的数对。来证明一个结论:对于 \(x<y<z<w\),如果选出来 \(a_x+a_w\) 小于 \(m\) 但是 \(a_y+a_z\) 不小于 \(m\),那么答案一定不比 \(a_w\) 小,所以可以考虑将 \(a_w,a_z\) 匹配,\(a_y,a_x\) 匹配,答案不会更劣。

意思就是说,(1)如果最终有一对匹配 \((a_i,a_j),i<j\),那么将其定义为 " \(j\) 选择了 \(i\) ",不管被选择的位置(即所有的 \(i\),同样我们定义 \(j\) 为 "主动选择位" ),剩下的位置一定在某一个分界点分开,前面的部分选择的匹配小于 \(m\),后面的部分选择的匹配不小于 \(m\)

接着证明(2)所有和不小于 \(m\) 的匹配的 "主动选择位" 一定是下标连续的一段后缀:如果存在 \(x<y<z<w\),其中 \(w\) 选择 \(z\)\(y\) 选择 \(x\)\(w,y\) 为满足上述要求的 "主动选择位",那么将匹配改为:\(w\) 选择 \(x\)\(y\) 选择 \(z\),一定不会更劣。

同时我们可以证明(3)这些和不小于 \(m\) 匹配在 "主动选择位" 递增的时候,"被选择位" 一定递减:如果存在 \(x<y<z<w\),其中 \(w\) 选择 \(y\)\(z\) 选择 \(x\)\(w,y\) 为满足上述要求的 "主动选择位",那么改为 \(w\) 选择 \(x\)\(z\) 选择 \(y\),两对数各自的和仍然不小于 \(m\),答案不会更劣。

此时考虑某一个位置 \(p\),在 \(p\) 之后的位置是所有和不小于 \(m\) 的匹配的 "主动选择位",那么(4)这些 "主动选择位" 选择的一定是 \(p\) 之前的一段连续的区间:如果存在 \(x<y<z<w\),其中 \(w\) 选择 \(x\)\(z\) 选择 \(y\),并且前者的和不小于 \(m\),后者的和小于 \(m\),那么答案一定不会小于 \(z\),因此将匹配改为:\(w\) 选择 \(z\)\(y\) 选择 \(x\),一定不会更劣。

也就是说将原序列变成长为 \([1,2p-n-2],[2p-n-1,p],[p,n]\) 的三部分,最后一部分是所有和不小于 \(m\) 的匹配的 "主动选择位",中间部分是后面部分匹配的位置。最前面的部分就不能出现和不小于 \(m\) 的匹配了,每次贪心将最大的和最小的匹配起来即可。

注意到,对于可能被钦定的和不小于 \(m\) 的匹配的 "主动选择位",如果 \(p\) 太小了和就会小于 \(m\) 导致不合法,一定是在 \(p\) 超过某个值时才合法,而且位置越靠后的 "主动选择位" 对 \(p\) 的要求一定越低。

这意味着,如果从小到大依次考虑 \(p\),那么一定有某一个时刻,在这个时刻之前不合法,在这个时刻之后合法。

同时注意到,对于合法的两个时刻 \(p=i\)\(p=j\)(其中 \(i<j\)),对于后面的部分,一定是 \(i\) 更优:每个 "主动选择位" 都不会匹配到比 \(j\) 的方案中的结果更大的结果;同样对于前面的部分,一定也是 \(i\) 更优:对于每个 "被选择位" 都不会匹配到比 \(j\) 的方案中的结果更大的结果。

因此只需要找到最小的合法时刻,二分即可,时间复杂度 \(O(n\log n)\)

代码:Submission #26076016 - AtCoder Grand Contest 032

posted @ 2021-09-24 16:47  Qiuly  阅读(86)  评论(0编辑  收藏  举报