QOJ.ac

QOJ

時間限制: 3 s 記憶體限制: 512 MB 總分: 100

#4573. 全球变暖

统计

你正在开发一款新的电脑游戏。让我们考虑海洋中间的一个岛屿,它位于一个 $z$ 轴朝上的三维空间中。海平面是一个 $z=0$ 的水平面。

该岛屿是一个特殊形式的多面体。

给定 $n$ 个点 $(x_i, y_i, z_i)$;它们之间存在一些边。如果我们从上方观察该岛屿,或者如果我们丢弃每个点的 $z$ 坐标,这些点和边构成一个平面连通图。该平面图的每个面(外部面除外)都是一个非退化三角形。图的每条边都至少属于一个内部面。所有位于平面图外部面边缘上的点的 $z$ 坐标都等于零。其他点可以具有任意非负的 $z$ 坐标。平面图的每个面对应于具有相同顶点的多面体的面。

由于全球变暖,海平面正在上升并淹没岛屿。你的任务是为游戏计算各种全球变暖场景。

在每个场景中,海平面上升到高度 $h$,使得海平面成为平面 $z=h$。岛屿中高度低于或等于 $h$ 的部分现在被淹没,即使某些部分可能无法通过水从海洋到达(参见第二个示例的插图)。在一个场景中,玩家站在第 $p$ 个点。你需要计算玩家所处岛屿部分的表面积,或者确定玩家所处位置处于或低于水位线并已溺水。

形式上,我们称岛屿表面上的两个点属于同一部分,如果玩家可以通过在岛屿表面行走,且始终保持在海平面之上,从而在它们之间移动。注意,你应该计算岛屿本身的表面积,而不是它在水平面上的投影面积。

输入格式

第一行包含一个整数 $n$ —— 点的数量 ($1 \le n \le 10^5$)。

接下来的 $n$ 行,每行包含三个整数 $x_i, y_i$ 和 $z_i$ —— 第 $i$ 个点的坐标 ($-10^6 \le x_i, y_i \le 10^6; 0 \le z_i \le 10^6$)。

下一行包含一个整数 $m$ —— 平面图内部面的数量 ($1 \le m \le 10^5$)。它们也是岛屿多面体的面。

接下来的 $m$ 行,每行包含三个整数 $a_i, b_i$ 和 $c_i$ —— 作为第 $i$ 个内部面顶点的三个点的索引 ($1 \le a_i, b_i, c_i \le n$)。

保证如果丢弃 $z$ 坐标,则所得图形是一个连通的平面图。除外部面外,其所有面都是非退化三角形。所有位于平面图外部面边缘上的点的 $z$ 坐标都等于零。

下一行包含一个整数 $q$ —— 要计算的全球变暖场景数量 ($1 \le q \le 10^5$)。

接下来的 $q$ 行,每行包含两个整数 $h_i$ 和 $p_i$ —— 海平面高度和玩家所站点的索引 ($0 \le h_i \le 10^6; 1 \le p_i \le n$)。

输出格式

对于每个场景,输出一个实数 —— 玩家所处岛屿部分的表面积。如果玩家的位置被水淹没,则输出 $-1$。

如果绝对误差或相对误差不超过 $10^{-6}$,则答案被认为是正确的。

样例

样例输入 1

5
0 0 0
2 0 0
2 2 0
0 2 0
1 1 4
4
1 2 5
2 3 5
3 4 5
4 1 5
7
0 1
0 5
1 5
2 5
3 5
4 5
5 5

样例输出 1

-1
16.492422502470642
9.276987657639736
4.123105625617661
1.030776406404415
-1
-1

样例输入 2

16
0 5 0
1 2 0
2 5 5
3 7 0
4 0 0
4 3 5
5 5 1
6 2 0
6 6 5
7 4 4
7 8 0
8 2 0
9 4 0
4 6 4
6 3 3
2 4 5
22
11 10 9
12 8 10
2 6 5
9 10 7
8 15 6
16 3 6
15 6 7
7 3 14
8 10 15
11 13 10
16 6 2
12 10 13
10 7 15
16 3 2
3 4 1
14 7 9
11 9 4
3 6 7
5 6 8
14 4 3
3 1 2
9 4 14
7
0 7
1 7
1 16
2 10
3 9
4 16
5 16

样例输出 2

120.483405354306325
-1
93.929895222484783
68.181919663536940
40.918561474148331
11.067441790921070
-1

说明

示例的插图是从上方观察岛屿的视图。海洋被阴影线覆盖。岛屿用等高线绘制,较高部分颜色较深。

第二个示例中的岛屿外观如下:

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.