#P14205. [ROI 2016 Day1] 要塞防御

[ROI 2016 Day1] 要塞防御

背景

译自 ROI 2016 Day1 T1. Оборона крепости

题目描述

被围困的要塞之墙由 nn 个防御段组成,这些防御段从 11 到 nn 编号。侦察报告称,在下一次进攻中,敌人将派出 aia_i 名士兵进攻编号为 ii 的防御段。要塞共有 ss 名守卫,需要分配到这些防御段上。

不同的防御段加固程度不同,这导致了防守效率的差异。编号为 ii 的防御段上,每一名守卫都能抵御 kik_i 名进攻者。假设编号为 ii 的防御段上派遣了 xix_i 名守卫。那么,如果敌人的数量不超过 xi⋅kix_i \cdot k_i,则该段防线将完全守住,不会有敌人突破;否则,将有 ai−xi⋅kia_i - x_i \cdot k_i 名敌人突破防线,攻入要塞。

你的任务是编写一个程序,合理分配守卫人数,使得总人数恰好为 ss,并使得突破要塞的敌人数最少。

输入格式

输入的第一行包含两个整数 nn 和 ss,分别表示防御段的数量和要塞的守卫总数(1≤n≤100 0001 \le n \le 100\,000;1≤s≤1091 \le s \le 10^9)。

接下来的 nn 行中,每行包含两个整数 ai,kia_i, k_i,分别表示进攻编号为 ii 的防御段的敌人总数,以及该段上每名守卫能够抵御的敌人数(1≤ai,ki≤1091 \le a_i, k_i \le 10^9)。

输出格式

输出一个整数——即最少能突破要塞的敌人数。

1 10
8 1
0
3 3
4 2
1 1
10 8
3

提示

样例解释

在第一个测试中,如果将全部 1010 名守卫派往唯一的防御段,他们可以击退所有 88 名敌人,因此不会有敌人突破防线。

在第二个测试中,一种可行的方案是将 22 名守卫派往第一个防御段,将 11 名守卫派往第三个防御段,这样可以使突破的敌人数量最小化。

数据范围

子任务编号 分值 nn ss aa kk 必须通过的子任务
1 17 1≤n≤1001 \le n \le 100 1≤s≤10 0001 \le s \le 10\,000 1≤ai≤1001 \le a_i \le 100 ki=1k_i = 1
2 21 ki≤2k_i \le 2 1
3 23 1≤ki≤1001 \le k_i \le 100 1, 2
4 39 1≤n≤100 0001 \le n \le 100\,000 1≤s≤1091 \le s \le 10^9 1≤ai≤1091 \le a_i \le 10^9 1≤ki≤1091 \le k_i \le 10^9 1, 2, 3

翻译由 ChatGPT-5 完成