//hdu6127 dp
/*
先把点按角度排序,然后想象一条线把平面划分为两部分,
每次旋转都保证越过一个点,并将这个点扔到另一个集合中。
所以先预处理出前缀和,然后每次把一个点从一个集合扔到另一个当中,再计算即可。
(过程实现时坑很多。。。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
#include <bitset>
using namespace std;
#define ll long long 
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
#define pb(a) push_back(a)
const int MAXN=500004;
int cases,n;
struct point{
	double x;
	double y;
	ll v; 
	bool operator<(point &a)const{
		return atan(y/x)<atan(a.y/a.x);
	}
}p[MAXN];
ll sump,sumn,ans;
int main(){
	//freopen("1008.in","r",stdin);
	//freopen("H_.out","w",stdout);
	//ios::sync_with_stdio(false);
	scfd(&cases);
	while(cases--){
		sump=sumn=0;
		cin>>n;
		fr(i,1,n){
			scanf("%lf%lf%lld",&p[i].x,&p[i].y,&p[i].v);
			if(p[i].x>0)
				sump+=p[i].v;
			else
				sumn+=p[i].v;
		}
		ans=sumn*sump;
		sort(p+1,p+n+1);
		fr(i,1,n){
			if(p[i].x>0){
				sump-=p[i].v;
				sumn+=p[i].v;
			}
			else{
				sump+=p[i].v;
				sumn-=p[i].v;
			}
			ans=max(ans,sump*sumn);
		}
		printf("%lld\n",ans);
	}

		
	return 0;
}
	
 posted on 2017-09-22 17:11  cylcy  阅读(74)  评论(0编辑  收藏  举报