Description
给出二维平面
n
个点的坐标
Input
第一行一整数
Output
输出最大得分
Sample Input
2
2
1 1 1
1 -1 1
3
1 1 1
1 -1 10
-1 0 100
Sample Output
1
1100
Solution
把所有点极角排序,用 y 轴开始逆时针旋转这条直线,每次把直线扫过的点放到另一侧,维护得分最大值即可
注:从
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define maxn 50005
#define PI acos(-1.0)
struct node
{
int x,y,val;
double angle;
bool operator<(const node&b)const
{
return angle<b.angle;
}
}p[maxn];
int T,n;
int main()
{
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=0.5*PI;
else p[i].angle=atan(1.0*p[i].y/p[i].x);
}
sort(p,p+n);
ll l=0,r=0;
for(int i=0;i<n;i++)
if(p[i].x>=0)r+=p[i].val;
else l+=p[i].val;
ll ans=l*r;
for(int i=0;i<n;i++)
{
if(p[i].x>=0)r-=p[i].val,l+=p[i].val;
else r+=p[i].val,l-=p[i].val;
ans=max(ans,l*r);
}
printf("%I64d\n",ans);
}
return 0;
}