P3644

Portal

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

显然两岸哪个是家哪个是办公室不重要。我们设它们的位置为 (lleq 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-aleq b-r)。移项得 (l+rleq a+b)。这样子就是一个关于 (l_i+r_i) 的不等式。于是又有了一个结论:按 (l+r) 排序后,选左边桥的一定是个前缀,于是选右边桥的是后缀。于是我们考虑惯用套路:枚举这个断点。

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

code

原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-p3644.html