100 #P2111. 二维银行家
二维银行家
Problem Description
kuro 在学习操作系统的时候接触到了著名的银行家算法。 对于一般的情况,可以使用课本上给出的算法进行安全性检查,但她认为这种做法太暴力了!她想知道:在一些特殊情形下,是否存在时间复杂度更优的算法?
具体地,kuro 只关心 资源种类数 (m = 2) 的情形。
形式化的说,现在有 两种不同的资源,你一开始分别拥有 个单位。
共有 个人在等待你提供资源。
对第 个人,有四个参数:
- :他需要的第 1 种资源数量
- :他需要的第 2 种资源数量
- :如果你满足他的需求,他额外返还的第 1 种资源数量
- :如果你满足他的需求,他额外返还的第 2 种资源数量
一次“操作”定义如下:
- 当前你拥有的两种资源为 。
- 若
则你可以对第 个人进行一次操作:
- 你先给出 ;
- 随后他返还给你 。
因此操作结束后,你拥有的资源变为:
你对 每个人最多只能进行一次操作,并且希望最终对 所有 个人都进行一次操作。
你的任务是判断是否存在一种顺序,使得:
- 在每一步操作时,你拥有的两种资源均保持非负;
- 最终每个人都恰好被操作一次。
若存在任意一种合法顺序,请输出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)$,代表总人数,初始拥有的两种资源数
接下来的行,每行包含四个整数$NeedX_i,NeedY_i,HasX_i,HasY_i(0 \leq NeedX_i,NeedY_i,HasX_i,HasY_i \leq 10^9)$,如题目描述中所示
Output Format
如果存在,输出一行"YES",第二行包含个整数,代表操作顺序,用空格隔开。
如果有多种方案,你可以输出任意一种。
如果不存在,输出一行"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
一种合法执行顺序为(可能不唯一):
- 当前 (3,3),执行点 1(需 1,2),更新为 (6,3)
- 执行点 3(需 2,3),更新为 (8,5)
- 执行点 2(需 3,1),更新为 (8,9)
- 执行点 4(需 4,4),更新为 (8,9)
全部点都能执行,故答案为 YES。
相关
在下列比赛中: