POJ 1265 Area

来源:互联网 发布:淘宝客广告海报 编辑:程序博客网 时间:2024/05/22 09:07

POJ 1265 Area

用到了传说中的pick定理

给定顶点座标均是整点(或正方形格点)的简单多边形皮克定理说明了其面积A和内部格点数目i、边上格点数目b的关系:A = i + b/2 - 1。

 (维基百科)

面积其实就是叉积和,边上点的个数是gcd(dx,dy);然后一切就可以搞定了。


不得不吐槽下POJ的G++。。。。。


表示很桑心。。。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>using namespace std;#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)#define oo 1e6#define eps 1e-8#define nMax 100000#define pb push_back#define F first#define S second#define bug puts("OOOOh.....");#define zero(x) (((x)>0?(x):-(x))<eps)#define LL long long#define DB doubleint gcd(int a,int b){return b==0?a:gcd(b,a%b);}int main(){#ifndef ONLINE_JUDGEfreopen("input.txt","r",stdin);#endifint t,n;scanf("%d",&t);FOR(cas,1,t){scanf("%d",&n);int area=0,on=0,in=0;int x=0,y=0;int dx,dy;for(int i=0;i<n;i++){scanf("%d%d",&dx,&dy);int d = gcd(dx,dy);if(d<0) d=-d;on += d;area += x*dy - y*dx;x += dx;y += dy;}if(area<0) area=-area;in = area-on+2;in /= 2;printf("Scenario #%d:\n%d %d %.1f\n\n",cas,in,on,(DB)area/2.0);}return 0;}


原创粉丝点击