Inside Yamanote
首先题面所给出的条件很松,可以任意加边,任意定首都,感觉很难做
考虑将条件转化一下,如果这个加边不去掉,感觉多项式很难做,所以先考虑转化加边条件
我们将它转化为 \(\forall i \in n\) ,$\lvert dis_i-dis_{i+1} \rvert \leq L_i $
考虑是为什么对,我们用归纳法证明,首先对于环上点数 \(\leq\) \(1\) 很显然是对的
我们考虑在环上插入一个点 \(i\) ,对于这个点,我们钦定首都对这个点连一条 \(dis_i\) 的边,
使得 \(\lvert dis_i-dis_{i+1} \rvert \leq L_i\),\(\lvert dis_i-dis_{i-1} \rvert \leq L_{i-1}\) ,这样环上任意点还都是合法的,证毕
现在我们的条件为 \(\forall i \in n\) ,\(\lvert dis_i-dis_{i+1} \rvert \leq L_i\) ,\(dis_i \geq 0\) 且至少有一个 \(dis_i=0\) ,我们要求的是 $ \sum dis_i*c_i$ 的最大值
我们发现一个条件 $ \sum c_i=0$ ,所以我们让所有的 \(dis_i \leftarrow dis_i+k\) 其 $ \sum dis_i*c_i$ 是不会变的,
所以我们可以将 \(dis_i \geq 0\) 这个条件去掉,因为当有负数时,我们让 \(dis\) 同时加上一个正整数即可
同时这也把首都这个条件也扔掉了,我们让可以钦定任意一个点当作首都,因为任意 \(dis\) 都可以加减一个整数变为 \(0\)
现在我们这个题的条件就转化为 \(\forall i \in n\) ,\(\lvert dis_i-dis_{i+1} \rvert \leq L_i\) ,求的是 $ \sum dis_i*c_i$ 的最大值
我们看到 \(dis_i-dis_{i+1}\) 是差分形式,所以考虑 \(dis\) 的差分数组 \(w_i=dis_{i+1}-dis_i\),
我们考虑 \(w_i\) 所带来的影响就是将 \(i\) 后面的所有 \(c_i\) 乘上 \(w_i\) 所以改变 \(c_i\) 为 $ \sum\limits_{j \geq i} c_i$ 之和
将条件转换为 求 \(\sum_{i=1}^{n-1} w_i*c_{i+1}\) 的最大值,$ \lvert w_i \rvert \leq L_i$ , \(\sum w_i=0\)
当我们不考虑 \(\sum w_i=0\) 时 ,可以贪心,当 \(c_i\leq 0\) 时,\(w_i=-L_i\),\(c_i > 0\) 时,\(w_i=L_i\)
现在为使 \(\sum w_i=0\),若 \(\sum w_i < 0\) 我们要使一些负 \(w_i\) 增大,每个负 \(w_i\) 可以增加 \(2*-w_i\) 次,增加一次减少 \(-c_i\)
选取影响最小的几个即可,另一种情况类似,这个我们放值域线段树上二分即可,在实现的过程中 \(w_n\) 可以在 \(-L_n \sim L_n\) 之间,特殊处理即可
时间复杂度 \(O((n+q)log n)\)

浙公网安备 33010602011771号