CF873E - Awards For Contestants

题意:对于 n 个人,每个人有一个分数,现在要把所有人分成四等,使得:

  • 前三类都有人

  • 前三类中,任意类的人数不大于其他类的人数的两倍

  • 不能有 i 的分数比 j 高但是所属的等级不如 j

  • 定义 di 是第 i 类的最低分和第 i+1 类的最高分的差,求最优的方案,按照 d1d2d3 为第一、第二、第三关键字排序

首先转化题意,我们考虑枚举一等和二等的人数 ij,枚举的同时加入两倍的限制,得到当前的 d1d2

然后我们考虑找到一种方式,得到“剩余 k 个人,要求三等奖的人数不小于 i2j2,不大于 2i2j 的最优的三等奖人数”。也就是 O(1) 找到一个最优的决策点使得当前点和前一个点的差最大,且当前点的下标在一个确定的范围 [l,r] 内。

首先,这是一个 rmq 问题,考虑 st 表,把所有的 a(i)a(i1),i 加入 st 表中,然后 O(nlogn)O(1) rmq求出 [l,r] 范围内使 aiai1 最小的 i,从而进行转移。这是比较暴力的做法。 Best Code by irkstepanov

但是我们可以有更优秀的做法。我们发现 [l,r] 的上下界是单调的,也就是随着 j 的增长,下界和上界都在单调的增长。这就提示我们使用单调队列优化。

我们可以把所有在界中的决策点丢进单调队列,每次随着j的增长,单调队列头部 pop 尾部 push,也可以 O(1) 的找到最优的决策点。Best Code by LHiC

posted @   jucason_xu  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示