Hard challenge
题目链接:Hard challenge
官方题解:
按照极角从小到大排序,从y轴开始逆时针扫一圈即可
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const double PI=acos(-1.0);
const int maxn=5e4+10;
struct point
{
int x,y,val;
double angle;
bool operator < (const point&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);
LL ls=0,rs=0;
for(int i=0; i<n; ++i)
{
if(p[i].x<0)
ls+=p[i].val;
else if(p[i].x>0)
rs+=p[i].val;
else if(p[i].y>0)
ls+=p[i].val;
else
rs+=p[i].val;
}
LL ans=ls*rs;
for(int i=0; i<n; ++i)
{
if(p[i].x<0)
ls-=p[i].val,rs+=p[i].val;
else if(p[i].x>0)
rs-=p[i].val,ls+=p[i].val;
else if(p[i].y>0)
ls-=p[i].val,rs+=p[i].val;
else
rs-=p[i].val,ls+=p[i].val;
ans=max(ans,ls*rs);
}
printf("%lld\n",ans);
}
return 0;
}
ps:想了多种,但还是这种扫法最简单,纯粹是套路。。