staggered 题解
题目选自:20261018 NOIP 模拟赛 T2
题意简述
现在我们有\(n\)个区间\([l_i,r_i]\),对于每个区间,我们要选择一个数\(x_i\),构成一个\(n\)个元素的集合.且这\(n\)个元素的和为\(m\). 现在,对于每个\(i \in [1,n]\),求出集合中地\(i\)大的元素最大是多少.
思考
我们考虑对于每个排名,我们二分确定最大值.
假设我们目前要求解第\(k\)小的元素是否可以大于等于\(x\),那么就要让至少\(n-k+1\)个元素要不小于\(x\),剩下的元素无所谓.
那么我们考虑先假设每个元素的为可选择区间的最大值. 即\(x_i=l_i\). 然后我们要选取\(n-k+1\)个元素进行调整使其不小于\(x\).
那么我们那些区间的元素可以被作为调整的候选对象呢?显然必须满足\(x \leq r_i\).
对于每个\(x \leq r_i\)的候选对象\(i\),我们将这个元素提升的代价为\(max\{x-l_i,0\}\) ,即我们这个选择这个区间对应的元素会导致我们所有元素的总和在原本全部选择左端点的基础上提升\(max\{x-l_i,0\}\) .
那么由于恰好等于\(m\)的限制,我们要保证我们增加的代价和为\(m-\sum_{i \in [1,n]}{l_i}\).
我们考虑怎么保证增加的代价和为\(m-\sum_{i \in [1,n]}{l_i}\)
我们发现,我们只需要保证增加的代价和不超过\(m-\sum_{i \in [1,n]}{l_i}\),因为剩余的代价代价预算随便分配即可.
综上,我们单次验证的复杂度是\(O(nlog_2n)\)的,同时,我们有二分和枚举排名的复杂度,所以总的复杂度是\(O(n^2log_2nlog_2V)\)的.
我们考虑优化
处于方便,我们设\(b=\sum_{i \in [1,n]}l_i\)
我们发现,判断一个\(x\)是否可行.等价于判断
\(\sum_{l_i前n-k+1大的候选区间i}max\{0,x-l_i\} \leq m-b\)
我们记录\(ans_i\)为第\(i\)大的元素的最大值.显然\(ans\)单调不下降.
同时,随着候选值的下降,候选区间单调增加.
那么我们可以逆序计算\(ans\)
那么我们一次就可以完成所有\(ans\)计算.
那么我们要依据ans的逆向单调性和区间候选状态的单调性来实现一次扫描完成全部的计算.
那么我们就要枚举阈值,即最大值.
但是暴力枚举要枚举\(10^9\)个值.
但是我们可以发现,只有区间右端点的值成为最大值的会导致候选区间增加.
也就是说我们只需要枚举那些右端点的值即可.
具体你线段树,权值线段树随便一个数据结构维护就好了
综上,总复杂度\(O(nlogn)\)

浙公网安备 33010602011771号