pku 3348 Cows(求凸包面积)

凸包模板求凸包顶点,面积模板求由凸包顶点构成的多边形面积,最后输出 面积/50。

#include <iostream> using namespace std; struct Node { int x,y; }pt[10000+5],pt2[10000+5]; inline int CrossMutiply(Node& p1,Node& p2,Node& p3) { return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); } int CMP(const void* a,const void* b) { Node *c=(Node*)a,*d=(Node*)b; int m=CrossMutiply(pt[0],*c,*d); if(m==0) return c->y-d->y; else return -m; } int Convex(int n) { int swap=0; for(int i=1;i<n;i++) { if(pt[i].y<pt[swap].y||(pt[i].y==pt[swap].y&&pt[i].x<pt[swap].x)) swap=i; } pt2[0]=pt[swap]; pt[swap]=pt[0]; pt[0]=pt2[0]; qsort(pt+1,n-1,sizeof(pt[0]),CMP); pt2[0]=pt[0]; pt2[1]=pt[1]; int top=1; for(int i=2;i<n;i++) { while(top>=1&&CrossMutiply(pt2[top-1],pt2[top],pt[i])<=0) top--; pt2[++top]=pt[i]; } return top+1; } int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&pt[i].x,&pt[i].y); } int cnt=Convex(n); int ans=0; pt2[cnt]=pt2[0]; Node temp; temp.x=temp.y=0; for(int i=0;i<cnt;i++) { ans+=CrossMutiply(temp,pt2[i],pt2[i+1]); } if(ans<0) ans=-ans; printf("%d/n",ans/100); return 0; }

你可能感兴趣的:(pku 3348 Cows(求凸包面积))