2017ACM暑期多校联合训练 - Team 7 1008 HDU 6127 Hard challenge (极角排序)
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 (极角排序)的更多相关文章
- 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)
题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...
- 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= ...
- 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: ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)
题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...
- 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)
题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
随机推荐
- Alpha阶段敏捷冲刺 DAY5
一.举行站立式例会 1.今天我们利用晚上的时间开展了站立会议,总结了一下之前工作的问题,并且制定了明天的计划. 2.站立式会议照片 二.团队报告 1.昨日已完成的工作 (1)改进了程序算法 (2)优化 ...
- 图文详解 IntelliJ IDEA 15 创建普通 Java Web 项目
第 1 部分:新建一个 Java Web Application 项目 File -> New -> Project…,请选择 Java EE 这个模块下的 Web Application ...
- 两个float 怎么比较大小
转自:http://blog.csdn.net/mydriverc2/article/details/49888947 float 类型不能比较相等或不等,但可以比较>,<,>=,& ...
- adb命令模拟按键事件KeyCode
例子: //这条命令相当于按了设备的Backkey键 adb shell input keyevent 4 //可以解锁屏幕 adb shell input keyevent 82 //在屏幕上做划 ...
- hdu3507 Print Article(斜率优化入门)(pascal)
Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he s ...
- python 内存问题(glibc库的malloc相关)
题记: 这是工作以来困扰我最久的问题.python 进程内存占用问题. 经过长时间断断续续的研究,终于有了一些结果. 项目(IM服务器)中是以C做底层驱动python代码,主要是用C完成 网络交互部分 ...
- [ACM]Codeforces Round #534 (Div. 2)
A. Splitting into digits Vasya has his favourite number n. He wants to split it to some non-zero dig ...
- yii2框架-yii2局部关闭(开启)csrf的验证
(1)全局使用,我们直接在配置文件中设置enableCookieValidation为true request => [ 'enableCookieValidation' => true, ...
- ctsc2009 移民站选址
分析:非常非常好的一道题! 首先需要对问题进行转化: 行列无关,对于行单独处理,对于列单独处理 必然存在一个最优方案使得每一个新站与旧站重合. 转化1很显然,对于转化2,是一类非常经典的“中位数问题” ...
- Libevent学习笔记(五) 根据例子学习bufferevent
libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...