QOJ.ac

QOJ

حد الوقت: 1.5 s حد الذاكرة: 64 MB مجموع النقاط: 100

#11056. 镜子陷阱

الإحصائيات

Byteasar 国王的宫殿里闹鬼了。心怀恶意的人声称那是已故 Byteasar 王后的鬼魂(她最近在可疑的情况下去世了),因为它像她生前一样,非常喜欢对着镜子端详自己。难怪 Byteasar 很乐意摆脱这个鬼魂!

Byteasar 决定在宫殿的一个房间里设置一个特殊的镜子陷阱。这是一个封闭、光线充足的房间,其每一面内墙都覆盖着镜子。此外,在它的每一个角落都可以安装激光枪或激光探测器。一旦鬼魂穿过其中一条激光束,警报就会响起,召唤 Byteasar 的捉鬼小队(作为皇家团队,他们更喜欢不被俗称为“捉鬼敢死队”),他们肯定会很快处理掉鬼魂。

安装镜子陷阱的房间形状是一个多边形,其相邻的边互相垂直。此外,每一条边的长度(以米为单位)都是整数。如果在一个角落安装了激光枪,其光束必须沿着该角落两面墙形成的角平分线射出(在平行于地面的平面内)。显然,如果激光束遇到镜子,它会发生反射,遵循常规的反射定律:入射光线与法线的夹角等于反射光线与同一法线的夹角。由于房间的结构,这个角度始终是 45 度。沿着角平分线射入放置有探测器的角落的光束会被其完全吸收。另一方面,沿着角平分线射入没有探测器的角落(尽管可能装有激光枪)的光束会被反射回来(旋转 180 度)。在所有其他情况下,光束的方向根本不会改变。

应该在房间里放置尽可能多的激光枪和激光探测器,使得每条激光束最终都被某个探测器吸收,没有两条激光束被同一个探测器吸收,且每个探测器都吸收了某条激光束。此外,激光枪和探测器不能放置在同一个角落。

一个镜子陷阱的例子,激光束从角落 1 射向角落 7。

编写一个程序:

  • 从标准输入读取镜子陷阱的形状描述,
  • 确定满足上述条件并能放置最大数量激光枪和探测器的方法,
  • 将结果写入标准输出。

输入格式

标准输入的第一行包含一个整数 $n$ ($4 ≤ n ≤ 100\,000$),表示镜子陷阱的墙壁数量。接下来的 $n$ 行,每行包含两个整数 $x_i$ 和 $y_i$,表示第 $i$ 个角落的坐标($1 ≤ i ≤ n$, $-1\,000\,000 ≤ x_i,y_i ≤ 1\,000\,000$),中间用空格分隔。每两个相邻的角落由一条平行于坐标轴的墙壁连接。除了相邻墙壁共用一个端点(即角落)外,没有两条墙壁共用点。房间的角落按顺时针顺序给出(即,如果沿着墙壁走,房间内部在右手边)。所有墙壁的总长度不超过 $300\,000$。

输出格式

程序应在标准输出的第一行输出一个整数 $m$,表示可以在镜子陷阱中设置的最大激光枪-探测器对数。在接下来的 $m$ 行中,每行应包含一对整数 $a_i$ 和 $b_i$,中间用空格分隔,其中 $a_i$ 表示放置激光枪的角落编号,$b_i$ 表示放置对应激光探测器的角落编号,满足 $1 ≤ a_i,b_i ≤ n$。如果存在多种最优方案,任选其一即可。

样例

输入 1

10
1 1
3 1
3 -2
-3 -2
-3 0
-1 0
-1 -1
2 -1
2 0
1 0

输出 1

5
10 5
1 7
2 9
3 8
4 6

图中描绘了镜子陷阱中激光枪和探测器的一种示例部署。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.