解题报告:HDU_6127:Hard challenge (极角排序)

题目链接

题意及官方题解:


补充:

我是以到x负半轴的弧度进行排序,然后扫过(0~PI)的弧度,中间每扫过一个点都要可能更新答案


代码:

#include<bits/stdc++.h>

const double pi=acos(-1.0);
using namespace std;

class point
{
public:
      int x,y,v;
      double radiu;

public:
   point(){};
   point (int a,int b)
   {
      x=a;
      y=b;
   }
}p[100010];
bool cmp(point a,point b){
   return a.radiu<b.radiu;
}

double calc(int x,int y){
      if (x<0 && y>0)      return atan((double)1.0*y/((double)-1.0*x));
      else if (x==0 && y>0)return (double)2.0*pi/4.0;
      else if (x>0 && y>0) return (double)2.0*pi/4.0+atan((double)1.0*x/((double)1.0*y));
      else if (x>0 && y==0)return (double)2.0*pi/2.0;
      else if (x>0 && y<0) return (double)2.0*pi/2.0+atan((double)(-1.0*y)/(double)(1.0*x));
      else if (x==0 && y<0)return (double)2.0*pi*((double)3.0/4.0);
      else if (x<0 && y<0) return (double)2.0*pi*((double)3.0/4.0)+atan(((double)-1.0*x)/((double)-1.0*y));
      else if (x<0 && y==0)return (double)0;
}

int main()
{
   //freopen("1008.in","r",stdin);
   //freopen("my_1008.out","w",stdout);
   int T,n;
   scanf("%d",&T);
   while (T--)
   {
      long long sum = 0 , ss = 0 , ans = 0;
      scanf("%d",&n);
      for (int i=0 ; i<n ; i++)
      {
         scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].v);
         p[i].radiu=calc(p[i].x,p[i].y);
         sum += p[i].v;
      }sort(p,p+n,cmp) ;
      int s = 0 ,e = 0 ;
      while(s<n&&p[s].radiu<=pi){
         double ed = pi + p[s].radiu;
         while(e<n&&p[e].radiu<=ed){
            ss += p[e++].v ;
            ans = max(ans,ss*(sum-ss));
         }ss -= p[s++].v;
         ans = max(ans,ss*(sum-ss));
      }printf("%lld\n",ans);
   }
   return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值