Codeforces-GYM101873 G Water Testing 皮克定理

Posted isakovsky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces-GYM101873 G Water Testing 皮克定理相关的知识,希望对你有一定的参考价值。

题意:

给定一个多边形,这个多边形的点都在格点上,问你这个多边形里面包含了几个格点。

题解:

对于格点多边形有一个非常有趣的定理:

多边形的面积S,内部的格点数a和边界上的格点数b,满足如下结论:

2S=2a+b-2

证明不难,对于格点长方形显然成立,对于高度为1的直角三角形也显然成立,那么我们想象,把两个满足皮克定理的多边形,沿着它们的一个平行与格线的边拼起来,假设拼的这个边长度为k,这两个图形原来在这里各有k个边界格点,拼起来之后,这2k个边界格点,变成了2个边界格点,和k-2个内部格点,神奇吧!它们的面积还是符合皮克定理, 任何图形都可以用长方形和高为1的直角三角形这样拼起来,因此定理得证。

边界格点数用gcd求,面积用叉乘求。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int maxn=1e5+10;
int n;
pll 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);
    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;

 

以上是关于Codeforces-GYM101873 G Water Testing 皮克定理的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces-gym-101020 problem C. Rectangles

101873

Gym101873 F. Plug It In!

POJ 1654 Area 多边形面积 G++会WA

[求助]WA2620i FAT AP的外置天线安装

8/2 multi4 E找规律+模拟,空间开小了然后一直WA。。。J爆搜check不严谨WA。。。multi3 G凸包判共线写错数组名???样例太好过.想哭jpg。