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

G - Water Testing————2s2=a*2-b+2;皮克定理

程序员文章站 2022-03-29 21:20:18
...

G - Water Testing

#include <bits/stdc++.h>
#include <unordered_map>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn = 3e5+1000;
typedef pair<ll,ll> PII;
map<string,int> ma;
int n;
PII p[maxn];
inline ll gcd(ll m,ll n){return n?gcd(n,m%n):m;}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        scanf("%lld%lld",&p[i].first,&p[i].second);
    }
    //s2:总面积,
    //a: 内部点的个数,
    //b: 边界上点 的个数,
    //2s2=a*2-b+2;皮克定理。

    //多边形的面积:这道题目里面可以把所有相邻的节点和原点相连,做成一个三角形,然后用两条边的叉积做出来每一个三角形的面积,加起来,
    //这道题目里面边界上点用每一条边,两端点一定在int的坐标上,然后这俩点之间的线段经过点的个数就是gcd(dx,dy)+1.
    //封闭图形,然后每一条边都占一就好,所以每一条边分配一个gcd(dx,dy);
    ll s2=0,b=0;
    for(int i=0;i<n;i++)
    {
        s2+=(p[i].first*p[(i+1)%n].second-p[i].second*p[(i+1)%n].first);
        b+=gcd(abs(p[i].first-p[(i+1)%n].first),abs(p[i].second-p[(i+1)%n].second));
    }
    cout<<(abs(s2)-b+2)/2<<endl;
    return 0;
}
相关标签: 数论 几何