传统题 1000ms 256MiB

二维银行家

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

Problem Description

kuro 在学习操作系统的时候接触到了著名的银行家算法。 对于一般的情况,可以使用课本上给出的算法进行安全性检查,但她认为这种做法太暴力了!她想知道:在一些特殊情形下,是否存在时间复杂度更优的算法?

具体地,kuro 只关心 资源种类数 (m = 2) 的情形。

形式化的说,现在有 两种不同的资源,你一开始分别拥有 X0,Y0X_0, Y_0 个单位。
共有 nn 个人在等待你提供资源。

对第 ii 个人,有四个参数:

  • NeedXiNeedX_i:他需要的第 1 种资源数量
  • NeedYiNeedY_i:他需要的第 2 种资源数量
  • HasXiHasX_i:如果你满足他的需求,他额外返还的第 1 种资源数量
  • HasYiHasY_i:如果你满足他的需求,他额外返还的第 2 种资源数量

一次“操作”定义如下:

  • 当前你拥有的两种资源为 (X,Y)(X, Y)。
  • 若X≥NeedXi,Y≥NeedYi,X \ge NeedX_i,\quad Y \ge NeedY_i, 则你可以对第 ii 个人进行一次操作:
    • 你先给出 NeedXi,NeedYiNeedX_i, NeedY_i;
    • 随后他返还给你 NeedXi+HasXi,  NeedYi+HasYiNeedX_i + HasX_i,\; NeedY_i + HasY_i。

因此操作结束后,你拥有的资源变为:

(X′,Y′)=(X+HasXi,  Y+HasYi).(X', Y') = (X + HasX_i,\; Y + HasY_i).

你对 每个人最多只能进行一次操作,并且希望最终对 所有 nn 个人都进行一次操作。

你的任务是判断是否存在一种顺序,使得:

  • 在每一步操作时,你拥有的两种资源均保持非负;
  • 最终每个人都恰好被操作一次。

若存在任意一种合法顺序,请输出YES和操作顺序;否则请输出 NO。

Input Format

第一行为三个整数$n,X_0,Y_0(1 \leq n \leq 2*10^5,0 \leq X_0,Y_0 \leq 10^9)$,代表总人数,初始拥有的两种资源数

接下来的nn行,每行包含四个整数$NeedX_i,NeedY_i,HasX_i,HasY_i(0 \leq NeedX_i,NeedY_i,HasX_i,HasY_i \leq 10^9)$,如题目描述中所示

Output Format

如果存在,输出一行"YES",第二行包含nn个整数,代表操作顺序,用空格隔开。

如果有多种方案,你可以输出任意一种。

如果不存在,输出一行"NO"。

Sample

输入

4 3 3
1 2 3 0
3 1 0 4
2 3 2 2
4 4 0 0

输出

YES
1 3 2 4

一种合法执行顺序为(可能不唯一):

  1. 当前 (3,3),执行点 1(需 1,2),更新为 (6,3)
  2. 执行点 3(需 2,3),更新为 (8,5)
  3. 执行点 2(需 3,1),更新为 (8,9)
  4. 执行点 4(需 4,4),更新为 (8,9)

全部点都能执行,故答案为 YES。

重庆邮电大学第二十届ACM程序设计大赛(现场赛)

未参加
状态
已结束
规则
XCPC
题目
11
开始于
2025-12-28 13:00
结束于
2025-12-28 18:00
持续时间
5 小时
主持人
参赛人数
4