欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算几何 - Icebergs - Gym 102501F

程序员文章站 2022-04-02 19:01:33
...

计算几何 - Icebergs - Gym 102501F

题意:

给 定 n 个 不 重 叠 的 多 边 形 , 每 个 多 边 形 给 定 m i 个 点 的 坐 标 , 给定n个不重叠的多边形,每个多边形给定m_i个点的坐标, nmi

计 算 出 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 1N10003P500x,y106


注意点:

模 板 函 数 是 求 的 是 有 向 面 积 , 绝 对 值 应 当 在 最 后 返 回 的 时 候 取 , 无 论 是 求 凹 多 边 形 和 凸 多 边 形 。 模板函数是求的是有向面积,绝对值应当在最后返回的时候取,无论是求凹多边形和凸多边形。

且 需 要 保 证 点 的 顺 序 是 按 照 逆 时 针 / 顺 时 针 给 出 的 , 否 则 无 法 唯 一 确 定 一 个 多 边 形 。 且需要保证点的顺序是按照逆时针/顺时针给出的,否则无法唯一确定一个多边形。 /

最 后 输 出 四 舍 五 入 , 应 该 先 用 d o u b l e 类 型 求 和 , 最 后 再 强 转 为 l o n g   l o n g , 最后输出四舍五入,应该先用double类型求和,最后再强转为long\ long, doublelong 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;
}