CF1844F Min Cost Permutation
先不考虑字典序的问题,只考虑最小值怎么求。
先考虑一个特殊情况:\(c=0\),也就是说我想要相邻两项之差的绝对值最小。那么将其从小到大排序以后就满足要求。
我们猜想实际上更一般的情况不会和这个差太多。不妨令 \(c>0\),实际上最小值就在升序排列的时候取到。
假设有四个升序排列的数,其差值设为 \(\Delta_1,\Delta_2,\Delta_3\),那么一定是按照从小到大的顺序选择。
假设以 \(1324\) 的顺序选择,那么价值为 \(|\Delta_1+\Delta_2-c|+\Delta_2+c+|\Delta_3+\Delta_2-c|\),如果按照顺序选,那么就是 \(|\Delta_1-c|+|\Delta_2-c|+|\Delta_3-c|\)。
·分类讨论:若 \(c>\Delta_2\),则 \(|\Delta_2-c|\) 比 \(\Delta_2+c\) 少 \(2\Delta_2\),而剩下两项 \(1234\) 最多比 \(1324\) 多 \(2\Delta_2\)。
若 \(c\leq \Delta_2\),则 \(|\Delta_2-c|\) 比 \(\Delta_2+c\) 少 \(2c\),加入 \(\Delta_2\) 之后也是最多多 \(2c\)。因此按照顺序选都不会更劣。
所以我们已经可以确定最小值是什么了,现在来确定字典序最小的情况。
若 \(c\geq 0\),那么直接按照从小到大的顺序摆就是最小的,并且显然字典序最小。我们只需要考虑 \(c<0\) 的情况。在这样的情况中,从大到小摆肯定是值最小的,但是不一定字典序最小。
首先我们仍然可以证明:在给定前缀的情况下,后缀倒序摆放一定是最优的。
如果出现最终序列 \(b_i<b_{i+1}\) 的情况,那么\(b_{i+1}-b_i-c\) 会被全部算到最终答案中。若改变最终序列的顺序,那么 \(b_{i+1}-b_i\) 是不会改变的,但是会有若干个 \(\Delta\) 合并起来,若超过了 \(c\),就会使答案整体变大,不优。
这样就可以 \(O(1)\) check 了,需要检验 \(O(n^2)\) 次,可以通过 F1。
然后进一步考虑 check success 的充要条件。如果一个值是剩下的 \(\max\) 显然是成功的。
否则按照上面证明后缀倒序摆放的思路,你提前了一个数,那么这个数提前导致的 \(\Delta\) 合并不能超过 \(c\),这样才会使总答案不变。同时,你提前的这个数插在了原来的第 \(i-1\) 个位置和剩下的最大值之间,你需要保证 \(b_i\geq b_{i-1}+c\),才会使得答案不变。
所以可以用 set 维护 \(\Delta\) 的合并,然后再用一个 set 维护可以被提前的值,在 set 里面二分即可。时间复杂度 \(O(n\log n)\)。