HDU6217 Hard challenge(计算几何)

链接:点击打开链接

极角排序,然后逆时针扫一遍,初始从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);
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值