题目链接

Problem Description

There are n points on the plane, and the ith points has a value vali, and its coordinate is (xi,yi). It is guaranteed that no two points have the same coordinate, and no two points makes the line which passes them also passes the origin point. For every two points, there is a segment connecting them, and the segment has a value which equals the product of the values of the two points. Now HazelFan want to draw a line throgh the origin point but not through any given points, and he define the score is the sum of the values of all segments that the line crosses. Please tell him the maximum score.

Input

The first line contains a positive integer T(1≤T≤5), denoting the number of test cases.

For each test case:

The first line contains a positive integer n(1≤n≤5×104).

The next n lines, the ith line contains three integers xi,yi,vali(|xi|,|yi|≤109,1≤vali≤104).

Output

For each test case:

A single line contains a nonnegative integer, denoting the answer.

Sample Input

2

2

1 1 1

1 -1 1

3

1 1 1

1 -1 10

-1 0 100

Sample Output

1

1100

题目描述:

平面上有(n)个点,已知每个点的坐标为((x,y)),以及改点的权值为(val),任意两点之间可以连接成一条不经过原点的边,该边的权值是两个端点的权值的乘积。现在要求画一条经过原点的直线,定义这条直线的权值为这条直线穿过的所有线段的值的和,问权值的最大值。

分析:

对于一条经过原点的直线,一定是把这(n)个点分为了左右两部分,只有连接左右两侧的线段才会对答案有贡献,又因为任意两点之间都有连线,整理后最后的权值就是直线一侧的点的和与另一侧点的和的乘积。现在问题就转化为找到一个最优的划分,使得两侧和的乘积最大。

将n个点按与原点的极角排序,只考虑(180)度的范围,因此按正切值从负无穷到正无穷排序。初始时分界线为(y)轴,横坐标小于(0)的为一部分,横坐标大于(0)的为另一部分,初始答案为这两部分的乘积。按排好的序依次处理每个点,相当于这条分界线在按逆时针转动,如果遇到一个横坐标为正的点,就把它扔到左侧,如果遇到横坐标为负的点,就扔到右侧,每次更新答案,遍历一遍后得到最大得分。

代码:

#include<cmath>
#include<cstdio>
#include<algorithm>
typedef long long ll;
using namespace std;
#define eps 1e-9
#define maxn 200005
struct Node
{
double x,y,ang;///横纵坐标,极角
int v;///权值
} p[maxn]; bool cmp(Node a,Node b)///结构体按照极角从小到大排序
{
return a.ang<b.ang;
}
int n,T;
ll sumL,sumR,ans;
void work()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].v);
p[i].ang=atan(p[i].y/p[i].x);
}
sort(p+1,p+n+1,cmp);
sumL=sumR=ans=0;
for(int i=1; i<=n; i++)
if (p[i].x>eps)sumL+=p[i].v;
else sumR+=p[i].v;
ans=sumL*sumR;
for(int i=1; i<=n; i++)
{
if (p[i].x>0)sumL-=p[i].v,sumR+=p[i].v;
else sumL+=p[i].v,sumR-=p[i].v;
ans=max(ans,sumL*sumR);
}
printf("%lld\n",ans);
}
int main()
{
scanf("%d",&T);
while (T--)
work();
return 0;
}

2017ACM暑期多校联合训练 - Team 7 1008 HDU 6127 Hard challenge (极角排序)的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)

    题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...

  2. 2017ACM暑期多校联合训练 - Team 6 1008 HDU 6103 Kirinriki (模拟 尺取法)

    题目链接 Problem Description We define the distance of two strings A and B with same length n is disA,B= ...

  3. 2017ACM暑期多校联合训练 - Team 2 1008 HDU 6052 To my boyfriend (数学 模拟)

    题目链接 Problem Description Dear Liao I never forget the moment I met with you. You carefully asked me: ...

  4. 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)

    题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...

  5. 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)

    题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...

  6. 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)

    题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...

  7. 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)

    题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...

  8. 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)

    题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...

  9. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

随机推荐

  1. linux svn启动和关闭

    linux svn启动和关闭 博客分类: linux系统 svnlinux  1,启动SVN sudo svnserve -d -r /home/data/svn/ 其中 -d 表示守护进程, -r ...

  2. yum 安装php环境

    centos下安装php环境 | 浏览:3831 | 更新:2014-11-04 17:01 1 2 3 分步阅读 在网上看了很多,很多都不能用,所以就把能用的实践下,过程记录下,方便自己和网友以后查 ...

  3. Sublime Text怎么设置文件在新标签打开?

    设置Sublime Text新标签页tab打开文件.Sublime Text Files not opening a new tab?每次打开文件,Sublime Text总是把当前的tab打开的文件 ...

  4. 编码转换,基础,copy

    阅读目录 编码转换 基础补充 深浅拷贝 文件操作 一,编码转换 1. ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符. 没有中⽂, 8个01代码, 8个bit, ...

  5. SQL中INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN区别

    sql中的连接查询有inner join(内连接).left join(左连接).right join(右连接).full join(全连接)四种方式,它们之间其实并没有太大区别,仅仅是查询出来的结果 ...

  6. presence_of_element_located与visibility_of_element_located区别

    selenium 问题:加了显性等待后,操作元素依然出错   背景: 用WebDriverWait时,一开始用的是presence_of_element_located,我对它的想法就是他就是用来等待 ...

  7. Shell脚本修改Nginx upstream配置文件

    #!/bin/bash ##################################################### # Name: change_nginx_upstream_conf ...

  8. P2610 [ZJOI2012]旅游

    题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出 ...

  9. Halum UVA - 11478(差分约束 + 二分最小值最大化)

    题意: 给定一个有向图,每条边都有一个权值,每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后要让所有边权的最小值非负且尽量大 两个特判 1 ...

  10. Android APK 反编译步骤

    dex2jar和jd-gui工具下载,链接:http://yun.baidu.com/share/link?shareid=2888715259&uk=1377615098 解压APK文件得到 ...