【CQOI2006】凸多边形

来源:互联网 发布:探索者软件 编辑:程序博客网 时间:2024/05/20 09:08

【CQOI2006】凸多边形

【题目描述】

逆时针给出n个凸多边形的顶点坐标,求它们交的面积。例如n=2时,两个凸多边形如下图:


则相交部分的面积为5.233。

【输入】

第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形。第i个多边形的第一行包含一个整数mi,表示多边形的边数,以下mi行每行两个整数,逆时针给出各个顶点的坐标。

【输出】

包含一个实数,表示相交部分的面积,保留三位小数。

【输入样例】

2
6
-2 0
-1 -2
1 -2
2 0
1 2
-1 2
4
0 -3
1 -1
2 2
-1 0

【输出样例】

5.233

【数据范围】

50%的数据满足:n=2
100%的数据满足:2<=n<=10,3<=mi<=50,每维坐标为[-1000,1000]内的整数
均匀分布着约30%的数据,满足Si≤1(不包含上述的数据);
对于100%的数据,1≤m,n≤250,0≤Si≤5,0≤Ai,j≤1,0<Ti,j<Ti,j+1,0<Wi,j<Wi,j+1,所有数据不大于10^5。

【题解】

计算几何第一题,撒花~

我们依次读入每一个多边形,然后枚举新读入的多边形的每条边和“当前交集多边形”的每条边,求出所有交点。接下来判断新多边形的每个顶点、“当前交集多边形”的每个顶点和所有交点是否同时在两个多边形内(即使有重复的点也无所谓),如果是,就给一个标记。最后所有有标记的点组成一个新多边形,下一次读入多边形后,这个新组成的多边形就充当“当前交集多边形”,所以读入所有多边形后的“当前交集多边形”就是所有多边形的交集,计算这个多边形的面积就好了。

上述过程都可以用朴素的实现方法,刘汝佳老师的大白书上讲的非常简洁易懂,点赞~我觉得只有一个步骤可以优化一下,凸多边形的交也是凸多边形(实际上凸集的交集都是凸的),而多边形又是按顺序给的,因此判断一个点是否在一个多边形内,只需判断其是否在多边形上或多边形每条边左侧。相比射线法和转角法,这个方法更容易,也不会出现误差(但只适用于凸多边形QAQ)。

【代码】

撒花撒花撒花~原来几何没有想得那么难嘛~

【CQOI2006】凸多边形#代码
0 0