#P14732. [Bulgarian2018春季赛]stores
[Bulgarian2018春季赛]stores
题目描述
在森林中的一片空地上,蚂蚁家族建造了 个小型地下仓库。其中一半储存植物性食物,另一半储存蛋白质。
蚂蚁在选择仓库位置时保证:任意三个仓库都不共线,这样更不容易被盗贼发现。
冬天快到了,需要在这些仓库之间挖掘地下通道,并封闭地面的入口。蚁后要求通道网络满足以下规则:
- 所有通道都在地下同一层,且必须是从一个仓库到另一个仓库的直线线段;除了端点仓库外,任意两条通道绝不能有其他公共点;
- 从任意一个仓库都必须能够到达任意另一个仓库,而且如果不允许回头走,那么到达路径必须是唯一的;
- 沿着任意通道移动时,经过的仓库类型必须交替变化,也就是说,每次都必须从植物性食物仓库走到蛋白质仓库,或反过来。
你是一名蚂蚁建筑师。正当你沉浸于对几只蚜虫的“生产活动”时,主管把你叫来布置任务:
“前期工作都完成了:空地上已经建立了坐标系,每个仓库的坐标(均为整数)也都给出来了。现在只差确定哪些仓库之间要修建通道。”
你为了尽快回去继续享受甜食,匆匆画了一张示意图(图 1)。其中存放植物性食物的仓库记为 ,存放蛋白质的仓库记为 。但主管看完后很不满意,因为这张图存在很多问题:
- 与 之间不应该有通道,因为它们都是蛋白质仓库,这违反了“仓库类型必须交替”的规则;
- 例如仓库 无法从 到达,这不允许;
- 例如 可以通过两条不同路径从 到达: 和 ,这同样违反规则;
- 通道 和 还有一个不是仓库的公共点,这也是禁止的。
看来事情没有那么简单。因此你决定编写程序 stores,来解决这一类问题。

图中给出一组不合法的通道方案,并标出上述几类违规情况:同类仓库直接相连、图不连通、存在两条不同简单路径、线段在非端点处相交。
输入格式
第一行输入一个正整数 。
接下来 行,每行两个非负整数,表示对应仓库的坐标。
- 前 行给出储存植物性食物的仓库;
- 后 行给出储存蛋白质的仓库。
在本题中,每个仓库还被赋予一个编号:它等于该仓库坐标所在输入行的行号减一,因此仓库编号从 到 。
输出格式
如果在给定坐标下,不可能按照规则构造通道网络,则输出一行 -1。
如果有解,则输出:
- 第 行:通道数量 ;
- 接下来的 行:每行两个整数,表示你打算修建一条连接这两个仓库的通道。
输出的仓库编号都应在 到 之间。
数据范围
- 所有仓库坐标都是非负整数,且不超过
- 任意三个仓库不共线
样例
输入
6
6 5
3 3
5 2
7 2
9 5
9 1
5 8
2 4
6 3
8 0
10 4
8 7
输出
11
6 11
11 5
10 4
4 9
3 9
9 5
5 12
12 1
1 7
2 7
8 2
样例说明
原题样例还给出了如下“编号—图 2 中标记”的对应关系:
| 仓库编号 | 图 2 中的标记 |
|---|---|
| 1 | P1 |
| 2 | P2 |
| 3 | P3 |
| 4 | P4 |
| 5 | P5 |
| 6 | P6 |
| 7 | Q1 |
| 8 | Q2 |
| 9 | Q3 |
| 10 | Q4 |
| 11 | Q5 |
| 12 | Q6 |

样例中 12 个仓库的位置,以及样例输出对应的一组合法通道方案。