C. 二维银行家

内存限制:256 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:Special Judge

题目描述

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

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

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

对第 个人,有四个参数:

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

一次“操作”定义如下:

  • 当前你拥有的两种资源为
  • 则你可以对第 个人进行一次操作:
    • 你先给出
    • 随后他返还给你

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

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

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

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

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

输入格式

第一行为三个整数,代表总人数,初始拥有的两种资源数

接下来的行,每行包含四个整数,如题目描述中所示

输出格式

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

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

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

样例

输入

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。