0%

The 2025 ICPC Asia East Continent Online Contest (II) ICPC网络赛第二场——A. Angry Birds

题目大意

题目总结

基本设定

  • 空间:三维欧几里得空间,建立 OxyzO-xyz 坐标系。

  • 对象:小鸟是一个半径为 R3R_3 的球体。

  • 运动平面:小鸟球心的运动轨迹始终位于 z=0z=0 的水平面上。

轨迹定义

  • 闭合折线:小鸟球心的轨迹是由 nn 个点按顺序连接而成的闭合折线(第 nn 点连回第 11 点)。

  • 传感器误差(关键条件)

    • 给定了 nn 个基准坐标 (xi,yi,0)(x_i, y_i, 0)
    • 实际的第 ii 个折线端点 (xi,yi,0)(x'_i, y'_i, 0) 并不固定,它可以位于以 (xi,yi,0)(x_i, y_i, 0) 为圆心、半径为 R2R_2 的圆盘(z=0z=0 面内)中的任意位置

目标问题

  • 定义集合 SS 为小鸟在所有可能的轨迹情况(即考虑端点在 R2R_2 误差圆内任意变动)下,球体可能经过的所有空间点的集合。

  • 求集合 SS凸包体积

输入输出

  • 输入TT 组数据。每组包含 nn(点数),R2R_2(误差半径),R3R_3(小鸟半径),以及 nn 个基准点的二维坐标。

  • 输出:凸包的体积(浮点数)。


样例解释

以样例为例:

  • 输入n=5n=5 个点,误差半径 R2=1R_2=1,小鸟半径 R3=1R_3=1

  • 基准点(0,0),(3,1),(2,3),(2,2),(1,3)(0,0), (3,1), (2,3), (2,2), (-1,3)

  • 几何理解:你需要想象这 5 个点,每个点都代表一个半径为 1 的“误差圆”。实际轨迹的折点可以在这些圆内任意取。小鸟本身又是半径为 1 的球。

  • 求解目标:计算包含所有这些可能性的最小凸多面体的体积。最终输出约为 77.622211120429589

思路讲解

Video

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Solve() {
ll N,R_deviate,R_bird;
cin >> N >> R_deviate >> R_bird;

vector<Point> poly(N);
for (int i=0;i<N;++i) {
cin>>poly[i];
}
// 先找到一个二维凸包
poly=make_convex_hull(poly);
// 凸包面积
DB ans=polygon_area(poly);
// 凸包和圆 deviate 的 minkowski 和
auto perimeter=polygon_perimeter(poly);
ans+=perimeter*R_deviate+pi*R_deviate*R_deviate;
// ans+=perimeter*R_deviate+pi*(R_deviate+R_bird)*(R_deviate+R_bird);

// minkowski 和 的体积(底乘高)
ans*=2*R_bird;
// 球体体积
ans+=4/3.0*pi*R_bird*R_bird*R_bird;
// 为什么这个高亮部分需要加上去?这个是这道题目的难点。
ans+=(pi*R_bird*R_bird*(perimeter+pi*R_deviate*2))/2.0;
cout<<fsp(12)<<ans<<"\n";
}

为什么这个高亮部分(piR_deviate2)需要加上去?这个是这道题目的难点。**

其实是对的,因为圆其实是一个边缘面积

Video

AC代码

AC
https://qoj.ac/submission/2008618

心路历程(WA,TLE,MLE……)