HDU6217 Hard challenge(计算几何)

来源:互联网 发布:mac os 进度条不动 编辑:程序博客网 时间:2024/05/24 00:11

链接:点击打开链接

极角排序,然后逆时针扫一遍,初始从y轴开始,把y轴左边的计算出一个和ls,右边的计算出和rs,每次扫到一个点,将该点加到左边,扫一圈,刷新最大的ls*rs即可

参考博客:传送门

#include<bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long LL;const double PI=acos(-1.0);const int maxn=5e4+10;struct node{    int x,y,val;    double angle;    bool operator <(const node&A)const    {        return angle<A.angle;    }}p[maxn];int main(){  int t,n;  scanf("%d",&t);  while(t--)  {      scanf("%d",&n);      for(int i=0;i<n;i++)     {         scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].val);         if(p[i].x==0)            p[i].angle=PI/2.0;            else                p[i].angle=atan(p[i].y*1.0/p[i].x);     }     sort(p,p+n);     long long ls=0,rs=0;     for(int i=0;i<n;i++)     {         if(p[i].x<0)          ls+=p[i].val;         else            rs+=p[i].val;     }     long long ans=ls*rs;     for(int i=0;i<n;i++)     {         if(p[i].x>=0)         {             rs-=p[i].val;             ls+=p[i].val;         }         else         {             ls-=p[i].val;             rs+=p[i].val;         }     ans=max(ans,ls*rs);     }     printf("%lld\n",ans);  }}


原创粉丝点击