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$
2.$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; |