QOJ.ac

QOJ

Limite de temps : 30.0 s Limite de mémoire : 256 MB Points totaux : 100

#17464. Encircling Circles

Statistiques

给定一个由不同半径、处于不同位置的圆组成的集合 $C$,这些圆可能会相互重叠。给定一个半径为 $r$ 的圆,如果 $r$ 足够大,这个圆可以被放置在某个位置,从而将集合 $C$ 中的所有圆都包含在内(即包围它们)。

半径为 $r$ 且能包围 $C$ 中所有成员圆的圆可能存在多个不同的位置。我们定义区域 $U$ 为所有这些位置的包围圆所覆盖区域的并集。换句话说,对于 $U$ 中的每个点,都存在一个半径为 $r$ 的圆,它同时包围了该点以及 $C$ 中的所有成员。你的任务是计算该区域 $U$ 的边界(周长)长度。

图 I.1 展示了圆集合 $C$ 和区域 $U$ 的一个例子。在图中,包含在 $C$ 中的三个圆用实线圆表示,包围圆的一些可能位置用虚线圆表示,而区域 $U$ 则用粗虚线闭合曲线表示。

图 I.1:圆集合的示例

输入格式

输入由多个数据集组成。数据集的数量少于 100。

每个数据集的格式如下:

$$n \quad r$$ $$x_1 \quad y_1 \quad r_1$$ $$x_2 \quad y_2 \quad r_2$$ $$\vdots$$ $$x_n \quad y_n \quad r_n$$

数据集的第一行包含两个正整数 $n$ 和 $r$,由一个空格隔开。$n$ 表示集合 $C$ 中圆的数量,且不超过 100。$r$ 表示包围圆的半径,且不超过 1000。

接下来的 $n$ 行中,每行包含三个由单个空格隔开的整数。$(x_i, y_i)$ 表示集合 $C$ 中第 $i$ 个圆的圆心位置,$r_i$ 表示其半径。

你可以假设 $-500 \le x_i \le 500$,$-500 \le y_i \le 500$,且 $1 \le r_i \le 500$。

输入结束由一行包含两个由单个空格隔开的零表示。

输出格式

对于每个数据集,输出一行,包含一个表示区域 $U$ 边界(周长)长度的小数。

输出的误差不应大于 0.01。你可以认为,当 $r$ 改变 $\epsilon$($|\epsilon| < 0.0000001$)时,区域 $U$ 的边界长度变化不会超过 0.001。

如果 $r$ 太小而无法覆盖 $C$ 中的所有圆,则输出一行,仅包含 0.0

输出中不应包含其他字符。

样例

输入样例 1

1 10
5 5 7
2 12
5 5 7
8 6 3
3 10
3 11 2
2 1 1
2 16 3
3 15
-5 2 5
9 2 9
5 8 6
3 38
-25 -10 8
30 5 7
-3 35 11
3 39
-25 -10 8
30 5 7
-3 35 11
3 800
-400 400 2
300 300 1
300 302 1
3 800
400 -400 2
300 300 1
307 300 3
8 147
130 80 12
130 -40 12
-110 80 12
-110 -40 12
70 140 12
70 -100 12
-50 140 12
-50 -100 12
3 493
345 154 10
291 111 75
-275 -301 46
4 55
54 0 1
40 30 5
27 36 10
0 48 7
3 30
0 3 3
-3 0 4
400 0 3
3 7
2 3 2
-5 -4 2
-4 3 2
3 10
-5 -4 5
2 3 5
-4 3 5
4 6
4 6 1
5 5 1
1 7 1
0 1 1
3 493
345 154 10
291 111 75
-275 -301 46
5 20
-9 12 5
0 15 5
3 -3 3
12 9 5
-12 9 5
0 0

输出样例 1

81.68140899333463
106.81415022205297
74.11215318612639
108.92086846105597
0.0
254.85616536128433
8576.936716409238
8569.462129048667
929.1977057481128
4181.124698202453
505.09134735536804
0.0
46.82023824234038
65.66979416387915
50.990642291793506
4181.124698202453
158.87951420768937

说明

图 I.2:样例输入中最后一个数据集的示意图

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.