题意:对于 \(n\) 个人,每个人有一个分数,现在要把所有人分成四等,使得:
-
前三类都有人
-
前三类中,任意类的人数不大于其他类的人数的两倍
-
不能有 \(i\) 的分数比 \(j\) 高但是所属的等级不如 \(j\)
-
定义 \(d_i\) 是第 \(i\) 类的最低分和第 \(i+1\) 类的最高分的差,求最优的方案,按照 \(d_1\rightarrow d_2\rightarrow d_3\) 为第一、第二、第三关键字排序
首先转化题意,我们考虑枚举一等和二等的人数 \(i\) 和 \(j\),枚举的同时加入两倍的限制,得到当前的 \(d_1\) 和 \(d_2\)。
然后我们考虑找到一种方式,得到“剩余 \(k\) 个人,要求三等奖的人数不小于 \(\dfrac{i}{2}\) 和 \(\dfrac{j}{2}\),不大于 \(2i\) 和 \(2j\) 的最优的三等奖人数”。也就是 \(O(1)\) 找到一个最优的决策点使得当前点和前一个点的差最大,且当前点的下标在一个确定的范围 \([l,r]\) 内。
首先,这是一个 \(\text{rmq}\) 问题,考虑 \(\text{st}\) 表,把所有的 \({a(i)-a(i-1),i}\) 加入 \(\text{st}\) 表中,然后 \(O(n\log n)\sim O(1)\) \(\text{rmq}\)求出 \([l,r]\) 范围内使 \(a_i-a_{i-1}\) 最小的 \(i\),从而进行转移。这是比较暴力的做法。 \(\text{Best Code}\) \(\text{by irkstepanov}\)
但是我们可以有更优秀的做法。我们发现 \([l,r]\) 的上下界是单调的,也就是随着 \(j\) 的增长,下界和上界都在单调的增长。这就提示我们使用单调队列优化。
我们可以把所有在界中的决策点丢进单调队列,每次随着j的增长,单调队列头部 \(\text{pop}\) 尾部 \(\text{push}\),也可以 \(O(1)\) 的找到最优的决策点。\(\text{Best Code}\) \(\text{by LHiC}\)
标签:Contestants,CF873E,题意,队列,text,Awards,最优,人数,单调 From: https://www.cnblogs.com/jucason-xu/p/17145840.html