钦定 \(p_1=0,p_2>0\),不难证明如果有解则一定存在 \(p_2>p_1\) 的解。考虑枚举和 \(d_{1,1}\) 是相同楼房,则 \(p_2\) 对于每一种情况有两种可能的位置:\(d_{1,1}+d_{2,i}\) 和 \(|d_{1,1}-d_{2,i}|\)。考虑判断这 \(2n\) 种可能的方案是否合法。
对于 \(d_{1,i}\) 和 \(d_{2,j}\) 它们是同一个楼房当且仅当 \(d_{1,i}+d_{2,j}=p_2\) 或 \(|d_{1,i}-d_{2,j}|=p_2\),于是想到对于可能匹配的 \((i,j)\) 连边,这样连出一个二分图,原题转化为求这个二分图的完美匹配。由于对于一条边 \((i,j)\) 只有两个合法的 \(p_2\),因此总边数为 \(\mathcal{O}(n^2)\),用 Dinic
跑最大匹配,则总复杂度为 \(\mathcal{O}(n^2\sqrt{n})\),足以解决此题。
但这题有更优秀的做法。
将 \(d_1\) 和 \(d_2\) 排序后,把相同的缩在一起,然后跑多重匹配,每个点要匹配的边数为缩在一起的点的个数。这时一个左部点 \(d_{1,i}\) 最多连两条边 \(|p_2-d_{1,i}|\) 和 \(p_2+d_{1,i}\),则这个图仅由链和环构成,排好序由于左边先减后增,右边单增,这个图不可能含有环,只能由若干条链构成,于是我们在每条链上贪心地匹配。
从链的一端开始,对于每个左部点都贪心地往前面匹配(即已经匹配好了的方向),为后面的点留下更多的位置,不难证明这样贪心一定是正确的。
连边的过程中通过上述的两个单调性,使用双指针也可以做到线性,因此总复杂度为 \(\mathcal{O}(n^2)\)。