你需要为一个建筑项目雇佣工人。共有 $N$ 名候选人申请该职位,编号从 $1$ 到 $N$。每位候选人 $k$ 要求如果被雇佣,其薪水至少为 $S_k$ 美元。此外,每位候选人 $k$ 都有一个资格等级 $Q_k$。建筑行业的规定要求你支付给工人的薪水必须与他们的资格等级成比例。例如,如果你雇佣了工人 $A$ 和 $B$,且 $Q_A = 3 \times Q_B$,那么你支付给工人 $A$ 的薪水必须恰好是支付给工人 $B$ 的三倍。你可以支付给工人非整数金额的薪水。这甚至包括无法用有限位小数表示的金额,例如三分之一美元或六分之一美元。
你手头有 $W$ 美元,希望尽可能多地雇佣工人。你决定雇佣哪些人以及支付给他们多少薪水,但你必须满足所选工人的最低薪水要求,并遵守行业规定。同时,你的总支出必须在 $W$ 美元的预算之内。
由于项目的性质,资格等级完全无关紧要,因此你只关心在不考虑资格等级的情况下最大化雇佣工人的数量。然而,如果存在多种实现这一目标的方法,你希望选择总支出最少的那一种。如果仍有多种方法,则你可以任选其中一种。
任务
编写一个程序,根据候选人不同的薪水要求和资格等级,以及你拥有的资金总额,确定你应该雇佣哪些候选人。你必须在遵守上述行业规定的前提下,尽可能多地雇佣候选人,并使总支出尽可能少。
数据范围
$1 \le N \le 500,000$ 候选人数量 $1 \le S_k \le 20,000$ 候选人 $k$ 的最低薪水要求 $1 \le Q_k \le 20,000$ 候选人 $k$ 的资格等级 $1 \le W \le 10,000,000,000$ 你拥有的资金总额
重要说明
$W$ 的最大值超过了 32 位整数的范围。你必须使用 64 位数据类型(例如 C/C++ 中的 long long 或 Pascal 中的 int64)来存储 $W$ 的值。详情请参阅技术信息表。
输入格式
你的程序必须从标准输入读取以下数据: 第一行包含整数 $N$ 和 $W$,以空格分隔。 接下来的 $N$ 行描述候选人,每行一名候选人。其中第 $k$ 行描述编号为 $k$ 的候选人,包含整数 $S_k$ 和 $Q_k$,以空格分隔。
输出格式
你的程序必须向标准输出写入以下数据: 第一行必须包含一个整数 $H$,即你雇佣的工人数量。 接下来的 $H$ 行必须列出你选择雇佣的候选人的编号(每个编号都是 $1$ 到 $N$ 之间不同的数字),每行一个,顺序不限。
子任务
对于任何给定的测试用例,如果你的候选人选择方案能够实现所有目标并满足所有约束,你将获得满分。如果你输出的文件第一行正确(即 $H$ 的值正确),但后续内容不符合上述描述,你将获得该测试用例 50% 的分数。即使输出格式不规范,只要第一行正确,也会按此规则处理。
对于总分 50 分的部分测试用例,$N$ 不超过 $5,000$。
样例
样例输入 1
4 100 5 1000 10 100 8 10 20 1
样例输出 1
2 2 3
说明 1
唯一能让你雇佣两名工人且满足所有约束的组合是选择工人 2 和 3。你可以分别支付给他们 80 美元和 8 美元,从而符合 100 美元的预算。
样例输入 2
3 4 1 2 1 3 1 3
样例输出 2
3 1 2 3
说明 2
在这里你可以雇佣所有三名工人。你支付给工人 1 一美元,支付给工人 2 和 3 每人 1.50 美元,你用拥有的 4 美元成功雇佣了所有人。
样例输入 3
3 40 10 1 10 2 10 3
样例输出 3
2 2 3
说明 3
在这里你无法雇佣所有三名工人,因为这需要 60 美元,但你可以雇佣其中任意两人。你选择雇佣工人 2 和 3,因为与其他两人组合相比,他们的总支出最少。你可以支付给工人 2 10 美元,支付给工人 3 15 美元,总计 25 美元。如果你雇佣工人 1 和 2,则必须分别支付至少 10 美元和 20 美元。如果你雇佣工人 1 和 3,则必须分别支付至少 10 美元和 30 美元。