P12691 [KOI 2022 Round 1] 补给

题目背景

试题来源:。中文翻译做了少量本土化修改。 按照[署名—非商业性使用—相同方式共享 4.0 协议国际版](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans)进行授权。

题目描述

在一个二维平面上有 $N$ 个军事基地。第 $i$ 个基地的位置是坐标 $(X_i, Y_i)$。 负责该区域的补给部队打算对所有基地进行补给。每个第 $i$ 个基地可以接受补给的日期是从第 $A_i$ 天到第 $B_i$ 天之间的某一天。 由于正处于战争时期,补给部队必须保持整体从左上方向右下方推进的队形,因此只能朝右上方向前进。因此,必须为每个基地分配一个具体的补给日期 $V_i$,使得满足以下所有条件: - 对所有的 $i$,都满足 $A_i \leq V_i \leq B_i$; - 对所有 $i, j$ 满足 $X_i < X_j$ 且 $Y_i < Y_j$ 时,必须满足 $V_i < V_j$; - 对所有 $i \ne j$,必须有 $V_i \ne V_j$。 给定各个基地的位置 $(X_i, Y_i)$ 以及它们可接受补给的日期范围 $[A_i, B_i]$,请编写一个程序判断是否存在一种补给日期的分配方案,满足上述所有条件。如果存在,输出 YES,并按基地编号顺序输出每个基地的分配日期;如果不存在,输出 NO。 下图展示了一个包含 6 个基地的示例情况。图中的每个点代表一个基地,点的右上方标注了该基地可以接受补给的日期范围。 ![](https://cdn.luogu.com.cn/upload/image_hosting/phg5424h.png) 下图还展示了为这些基地安排补给日期的一个可行方案,点的右下方标注了分配给每个基地的具体补给日期。图中弯曲的线表示补给部队在第 2 天至第 3 天之间可能处于的位置范围。 ![](https://cdn.luogu.com.cn/upload/image_hosting/4uzfezse.png)

输入格式

第一行输入一个整数 $N$,表示基地的数量。 接下来 $N$ 行,每行输入四个整数 $X_i$, $Y_i$, $A_i$, $B_i$,以空格分隔,表示第 $i$ 个基地的位置和其可接受补给的日期范围。

输出格式

如果存在合法的补给方案,第一行输出 `YES`,第二行输出 $N$ 个整数,表示按基地编号顺序分配的补给日期,数与数之间以空格分隔。 如果不存在合法的补给方案,输出 `NO`。

说明/提示

**约束条件** - 所有给定的数都是整数。 - $1 \leq N \leq 250\,000$ - $1 \leq A_i \leq B_i \leq N$ - $1 \leq X_i \leq N$ - $1 \leq Y_i \leq N$ - 所有 $X_i$ 互不相同,即 $i \ne j$ 时 $X_i \ne X_j$ - 所有 $Y_i$ 互不相同,即 $i \ne j$ 时 $Y_i \ne Y_j$ **子任务** 1. (13 分)$N \leq 10$ 2. (18 分)$N \leq 2\,500$ 3. (22 分)对所有 $i$,满足 $B_i = N$ 4. (47 分)无附加限制