P3644 - 八邻旁之桥 题解

Portal

首先注意到家和办公室在河同侧的是方案唯一的(就直接走),先算到答案里面去。然后剩下来的都是被分在两岸的。

显然两岸哪个是家哪个是办公室不重要。我们设它们的位置为 \(l\leq r\)。于是如果通过的桥为 \(a\),不难列出走的路程的式子 \(|l-a|+|r-a|+1\)(我当时就是没想到把式子列出来,进一步通过 \(+\) 号拆成两个独立的元素,而想着以家、办公室的对为最小元素做,这显然是麻烦的),其中这个 \(1\) 也可以预处理掉,剩下两个绝对值之和。

\(m\) 分类:

  1. \(m=1\)。这个其实简单至极,就算不列式也可以轻松做。不过我们已经把式子列出来了,那就照这个思路做吧。我们设这条唯一的桥为 \(a\),那么答案就是 \(\sum(|l_i-a|+|r_i-a|)\),不难发现 \(\sum\) 后面的两项也是独立的(这是本题的关键),于是拆开,拆成 \(2n\)\(|x-a|\) 的和。那么根据初一数学我们知道 \(a\)\(x\) 的中位数的时候最优;

  2. \(m=2\)。依然沿用上面的思路,只不过对于桥 \(a<b\) 每个人可以有两种决策(目前为止还不能拆开,因为家和办公室的决策必须相同)。我们考虑对 \(l,r\)\(a\)\(b\) 哪个更优呢?分成四类(\(l\)\(a\) 的关系、\(r\)\(b\) 的关系)不难列出条件式:\(l\) 更优当且仅当 \(l-a\leq b-r\)。移项得 \(l+r\leq a+b\)。这样子就是一个关于 \(l_i+r_i\) 的不等式。于是又有了一个结论:按 \(l+r\) 排序后,选左边桥的一定是个前缀,于是选右边桥的是后缀。于是我们考虑惯用套路:枚举这个断点。

    断点两边显然是独立的。对于每边,这时候可以将绝对值拆开了,归约到了 \(m=1\) 的时候。于是现在问题就是如何快速求出每个前缀的中位数(又暴露了 APIO 的毒瘤 DS 本质)。显然要从左往右依次加入数。那么维护这个傻子都能想到平衡树,但是 hb 沥尽心血教我们如何不用平衡树、线段树等数据结构,我们也不能辜负他的期望。这个插入数、查 xth 显然离散化然后值域 BIT 倍增也可以。还有一种更简便的方法:维护左右两半的 set,每次插入后调整一下左右两边的相对单调性,然后微调一下两边的元素个数平衡即可,这个还是挺自然的。

code

posted @ 2020-11-30 23:25  ycx060617  阅读(74)  评论(0编辑  收藏  举报