链接:点击打开链接
极角排序,然后逆时针扫一遍,初始从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);
}
}