1 条题解
-
0
题意理解
我们有 个选手,第 个选手的属性为 。
对于非负整数 ,选手 的表现值为:选手 的排名定义为:
省队名额为 ,即 才能进队。
我们需要对每个 :
- 判断是否存在 使得 ;
- 如果能,求 。
关键观察
1. 比较两个选手的表现
对于选手 和 ,比较 与 : [ a_i x + b_i > a_j x + b_j \quad \Leftrightarrow \quad (a_i - a_j) x > b_j - b_i ] 这是一个关于 的线性不等式。
- 如果 ,则大小关系由 与 决定,与 无关。
- 如果 ,则存在一个临界点 ,在 两侧大小关系相反。
因此,每个 对最多在某个 处发生一次表现值的大小反转。
2. 排名的变化性质
当 从 增加到 时,排名只在有限个临界点发生变化。
这些临界点是所有 中非负的有理数(或实数,但可离散化)。因此, 的有效取值可以看作:、临界点、以及临界点之间的区间代表点、。
3. 问题转化
对于选手 ,我们想知道:
- 是否存在 使得不超过 个人的表现严格大于他。
- 等价地:存在 使得严格大于他的人 。
记 ,。
解法思路
步骤 1:按 分类
将选手按 分组,同组内按 排序。
对于 ,表现值的大小主要由 决定:
- 大的选手,当 很大时表现值大。
- 相同则按 大小决定。
步骤 2:考虑 和
当 时,表现值就是 ,排名按 降序排列。
当 时,表现值主要由 决定, 大的排前面, 相同时按 降序。
步骤 3:选手 能进队的条件
选手 能进队,当且仅当存在 使得 。
考虑 和 两个极端:
- 如果在 时 ,则直接可以进队。
- 如果在 时 ,也可以进队。
- 否则,如果在某个中间 处 ,也可以进队。
步骤 4:如何求可能的最好排名
最好排名是:
即最小化严格大于他的人数 。
步骤 5: 的特殊情况
当 时,只有排名第 1 才能进队。
即必须存在 使得 ,即 是最大值(可能并列)。结论: 时,能进队的选手必须是在所有 中,可能成为表现值最大的人(即在上凸壳上)。
步骤 6:一般情况下的高效算法
我们可以用扫描线方法:
- 将所有选手按 分组,组内按 降序。
- 考虑 从 增加到 的过程,维护当前排名。
- 排名变化只发生在临界点,即两个选手的表现值相等的 值。
- 对每个选手,记录其排名的最小值。
具体实现时:
- 我们只关心每个选手的排名变化,可以枚举 的候选值(所有临界点和两个端点)。
- 但临界点有 个,需要优化。
步骤 7:优化
注意到,当 变化时,排名变化是交换相邻的选手(如果按 排序)。
因此,我们可以用“交换逆序对”的方式来考虑:
初始时按 排序(即按 降序),然后当 增加时,某些 会交换位置,如果 且初始 ,则当 超过 时, 会超过 。这样,我们只需要考虑 个交换事件,但可以用归并排序式的方法减少事件数。
步骤 8:最终算法框架
- 初始按 降序排列得到排名。
- 找出所有可能的交换事件(即相邻的逆序对在某个 处交换),用优先队列处理。
- 在 变化过程中维护每个人的排名,并记录其最佳排名。
- 最后输出:如果最佳排名 则输出最佳排名,否则输出 。
公式总结
- 表现值:
- 排名:
- 临界点( 与 表现相等):(当 且符号使 )
- 比较规则:
时间复杂度
如果暴力枚举所有 临界点,复杂度 或 ,在 时可过。
对于 大的情况,需要更高效的扫描线维护,最优可做到 或 。
- 1
信息
- ID
- 4520
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者