凸包(模板)

    科技2025-09-18  19

    #define ll long long struct Point{ int x,y; }p[N]; Point ch[N]; bool cmp(Point x,Point y){ return x.x<y.x||(x.x==y.x&&x.y<y.y);//x从小到大排序,如果x相同则y从小到大排序 } int Cross(Point x,Point y,Point z){ ll x1=x.x-y.x; ll y1=x.y-y.y; ll x2=z.x-y.x; ll y2=z.y-y.y; if((x1*y2-x2*y1)<=0) return 0;//在右边(关于 2. ) return 1; } int main(){ sort(p,p+n,cmp); int m=0; //从左到右扫描 for(int i=0;i<n;i++){ while(m>1&&!Cross(ch[m-1],ch[m-2],p[i])) m--; ch[m++]=p[i]; } int k=m; //从右到左扫描 for(int i=n-2;i>=0;i--){ while(m>k&&!Cross(ch[m-1],ch[m-2],p[i])) m--; ch[m++]=p[i]; } //删去重复的起点 if(n>1) m--;//凸包有m个顶点 return 0; }

     

    Processed: 0.012, SQL: 9