P6844 [CEOI 2019] Building Skyscrapers

题目描述

在 2D 平面上,有 $n$ 个计划建摩天楼的格子,第 $i$ 座计划建的摩天楼的格子位于 $(r_i,c_i)$。 您可以选择任意一种建摩天楼的顺序,但是要满足如下设定: - 设建摩天楼的顺序为 $s$。 - 对于任意 $2\le i\le n$,都要保证,第 $s_i$ 座至少和前面任意一座摩天楼有公共边或公共角。 - 对于任意 $1\le i\le n$,都要保证,从第 $s_i$ 座计划建摩天楼的格子到 2D 平面的边界,有路径相连(从一个格子只能走到与其有公共边的格子),且路径上除第 $s_i$ 座摩天楼无其他摩天楼。 同时会输入一个 $t$,表示输出的类别: - 若 $t=1$,您需要构造任意一种建造的顺序。 - 若 $t=2$,您需要构造 $(s_n, s_{n - 1}, \dots, s_1)$ 字典序最大的建造顺序。

输入格式

第一行一个整数 $n$。 第二行一个整数 $t$。 接下来 $n$ 行,每行两个整数 $r_i,c_i$,第 $i$ 行表示第 $i$ 座计划建的摩天楼的坐标为 $(r_i,c_i)$。

输出格式

第一行为一个字符串 `YES` 或者 `NO`,表示是否有一种可行的方案。 若有一种可行的方案,接下来输出 $n$ 行,一行一个整数表示您构造的方案。 - 若 $t=1$,您需要构造任意一种建造的顺序。 - 若 $t=2$,您需要构造 $(s_n, s_{n - 1}, \dots, s_1)$ 字典序最大的建造顺序。

说明/提示

#### 样例解释 #### 样例 1 解释 这是三个摩天楼连成一行,自然有如下几种解: - $1,2,3$ - $2,1,3$ - $2,3,1$ - $3,2,1$ 因为 $t=2$,所以输出第一种。 #### 样例 2 解释 和样例 1 的区别只是三个摩天楼连成一条对角线,与样例 1 的解一致,又因为 $t=1$,随便输出一组即可。 #### 样例 3 解释 两个摩天楼无相交部分,自然无法建立。 #### 数据范围 对于 $100\%$ 的数据,保证 $1\le n\le 1.5\times 10^5$,$1\le t\le 2$,$\lvert r_i \rvert,\lvert c_i \rvert\le 10^9$。 详细子任务限制及分值如下表: | 子任务编号 | 限制 | 分值 | | :-: |:-:|:-:| | 1 | $t=1$ 且 $n\le 10$ | $8$ | | 2 | $t=1$ 且 $n\le 200$ | $14$ | | 3 | $t=1$ 且 $n\le 2\times 10^3$ | $12$ | | 4 | $t=2$ 且 $n\le 2\times 10^3$ | $17$ | | 5 | $t=1$ | $20$ | | 6 | $t=2$,$n\le 7\times 10^4$ 且 $\lvert r_i \rvert,\lvert c_i \rvert\le 900$ | $10$ | | 7 | $t=2$ | $19$ | #### 说明 本题译自 [Central-European Olympiad in Informatics 2019](https://ceoi.sk/) [Day 1](https://ceoi.sk/tasks/) [T1 Building Skyscrapers](https://ceoi.sk/static/statements/skyscrapers-ENG.pdf)。