计算几何 - Icebergs - Gym 102501F
计算几何 - Icebergs - Gym 102501F
题意:
给 定 n 个 不 重 叠 的 多 边 形 , 每 个 多 边 形 给 定 m i 个 点 的 坐 标 , 给定n个不重叠的多边形,每个多边形给定m_i个点的坐标, 给定n个不重叠的多边形,每个多边形给定mi个点的坐标,
计 算 出 n 个 多 边 形 的 面 积 之 和 。 计算出n个多边形的面积之和。 计算出n个多边形的面积之和。
Examples
Input
1
4
0 0
1 0
1 1
0 1
Output
1
Input
2
5
98 35
79 90
21 90
2 36
50 0
3
0 0
20 0
0 20
Output
6100
数据范围:
1 ≤ N ≤ 1000 , 3 ≤ P ≤ 50 , 0 ≤ x , y ≤ 1 0 6 1≤N≤1000,3≤P≤50,0≤x,y≤10^6 1≤N≤1000,3≤P≤50,0≤x,y≤106
注意点:
模 板 函 数 是 求 的 是 有 向 面 积 , 绝 对 值 应 当 在 最 后 返 回 的 时 候 取 , 无 论 是 求 凹 多 边 形 和 凸 多 边 形 。 模板函数是求的是有向面积,绝对值应当在最后返回的时候取,无论是求凹多边形和凸多边形。 模板函数是求的是有向面积,绝对值应当在最后返回的时候取,无论是求凹多边形和凸多边形。
且 需 要 保 证 点 的 顺 序 是 按 照 逆 时 针 / 顺 时 针 给 出 的 , 否 则 无 法 唯 一 确 定 一 个 多 边 形 。 且需要保证点的顺序是按照逆时针/顺时针给出的,否则无法唯一确定一个多边形。 且需要保证点的顺序是按照逆时针/顺时针给出的,否则无法唯一确定一个多边形。
最 后 输 出 四 舍 五 入 , 应 该 先 用 d o u b l e 类 型 求 和 , 最 后 再 强 转 为 l o n g l o n g , 最后输出四舍五入,应该先用double类型求和,最后再强转为long\ long, 最后输出四舍五入,应该先用double类型求和,最后再强转为long long,
若 直 接 用 l o n g l o n g 型 进 行 求 和 , 每 加 一 次 都 可 能 会 损 失 一 次 精 度 。 若直接用long\ long型进行求和,每加一次都可能会损失一次精度。 若直接用long long型进行求和,每加一次都可能会损失一次精度。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
const double eps=1e-10;
const double pi=acos(-1.0);
struct Point
{
double x,y;
Point(double x=0,double y=0) : x(x), y(y) {}
};
//点与向量
typedef Point Vector;
Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }
Vector operator - (Point A,Point B) { return Vector(A.x-B.x,A.y-B.y); }
Vector operator * (Vector A,double p) { return Vector(A.x*p,A.y*p); }
Vector operator / (Vector A,double p) { return Vector(A.x/p,A.y/p); }
double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; } //若A到B逆时针则为正,否则为负
double PolygonArea(Point p[], int n) //多边形的有向面积
{
double area=0;
for(int i=1;i<n-1;i++) area+=Cross(p[i]-p[0],p[i+1]-p[0]);
return fabs(area/2);
}
Point V[1010][60];
int main()
{
int m,n;
scanf("%d",&m);
double area=0;
for(int i=0;i<m;i++)
{
scanf("%d",&n);
for(int j=0;j<n;j++) scanf("%lf%lf",&V[i][j].x,&V[i][j].y);
area+=PolygonArea(V[i],n);
}
printf("%lld\n",(ll)area);
return 0;
}