CF1477E - Nezzar and Tournaments
CF1477E - Nezzar and Tournaments
题目大意
有两队人 \(a_i,i\in[1,n],b_j,j\in[1,m]\) ,现在把他们放在一起排成一行 \(c_i\)
顺次给每个人计分,初始 \(s_0=k\)
\(s_i=\max\{0,s_{i-1}+c_i-c_{\max\{i-1,1\}}\}\)
现在要最大化每个 \(a_i\) 所在位置的 \(s_i\) 之和 与 \(b_i\) 所在 \(s_i\) 之和 的差
支持修改和对于不同 \(k\) 查询
分析
考虑 \(k=0\) 简单情况
1.若 \(s_i\) 不清零,则 \(s_i=c_i-lst\) ,其中 \(lst\) 表示上一个被清零位置的 \(c_j\)
- \(s_i\) 清零,则 \(c_i<lst\)
容易发现, \(\displaystyle s_i=c_i-\min_{j\leq i}\{ c_j\}\)
那么对于含 \(k\) 的情况,类似可以得到
\(\displaystyle s_i=k-c_1+c_i+\max\{0,c_1-k-\min_{j\leq i}\{c_j\}\}\)
假设我们固定了一个 \(c_1\) ,现在考虑对于剩下的 \(a_i,b_j\) 排出一个最优的排列
容易发现, \(k-c_1+c_i\) 的贡献时固定的,只有前缀最小值会影响答案
我们希望对于 \(b_i\) ,前缀最小值较大, \(a_i\) 反之
那么容易发现可以先降序排列 \(b_j\) ,再正序排列 \(a_i\)
此时 \(b_{\min}\) 可以贡献给 \(a_i\) 的前缀最小值,同时 \(b_j\) 的前缀最小值能够取到最大
此时,不妨设 \(c_1=t\) , \(\min\{a_i,b_i\}=Min\)
在 \(\min\{c_j\}=c_1\) 时, \(\max\) 里的东西没有贡献,故可以得到
1.对于每个 \(a_i\) ,若它没有被放在 \(c_1\) ,则贡献 \(k-t+a_i+\max\{0,t-k-Min\}\)
2.对于每个 \(b_i\) (不特殊考虑第一个),则贡献 \(-(k-t+b_i+\max\{0,t-k-b_i\})\) (忽略最小值为 \(t\) 的情况)
则最终式子为
\(\displaystyle f(t)=(n-[t\in a_i])\cdot \max\{0,t-k-Min\}-\sum \max\{0,t-k-b_i\}+(m-n)t+C\)
其中 \(C=(n-m)k+\sum a_i-\sum b_i\)
容易发现 \(f(t)\) 是关于 \(t\) 的分段一次函数,根据斜率变化情况分析,极值位置仅 \(O(1)\) 个
那么对于 \(a_i\) 作为 \(t\) 和 \(b_j\) 作为 \(t\) 的情况,分别计算 \(f(t)\) 的极值位置
极值位置需要一个 \(k\) 大查询和 \(\text{lower_bound}\)
计算 \(f(t)\) 需要一个前缀查询
我用 \(\text{BIT}\) 充当平衡树来维护,复杂度为 \(O((n+m+q)\log 10^6)\)
1 | const int N=1e6+10,INF=1e9+10; |