【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge
acm.hdu.edu.cn/showproblem.php?pid=6127
【题意】
- 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权
- 这n个点两两可以连乘一条线段,定义每条线段的权值为线段两端点点权的乘积
- 现在要过原点作一条直线,要求这条直线不经过任意一个给定的点
- 在所有n个点两两连成的线段中,计算与这条直线有交点的线段的权值和
- 最大化这个权值和并输出
- 题目保证,给定的n个点不重合且任意两个点的连线不经过原点
【思路】
- 一条经过原点的直线把n个点分成两个半平面A,B
- 假设A中的点权分别为a1,a2....an;B中的点权分别为b1,b2,......bm。则结果为sumA*sumB
- 极角排序,枚举每个起点,线性扫一圈,计算半平面的点权之和,不断更新最优值
【AC】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm> using namespace std;
typedef long long ll;
const int maxn=5e4+;
int n;
double xx[maxn];
double yy[maxn];
ll val[maxn];
ll ans[maxn]; double dis(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
const double eps = 1e-;
struct Point
{
double x;
double y;
ll val;
double dis;
double alf;
Point(){}
Point(double _x,double _y):x(_x),y(_y){}
Point(double _x,double _y,ll _val):x(_x),y(_y),val(_val){}
Point operator -(const Point &t) const
{
return Point(x-t.x,y-t.y);
}
double operator ^(const Point &t)const
{
return (x*t.y)-(y*t.x);
}
}p[maxn];
Point o(0.0,0.0);
bool cmp(const Point &a, const Point &b)//先按象限排序,再按极角排序,再按远近排序
{
if (a.y == && b.y == && a.x*b.x <= )return a.x>b.x;
if (a.y == && a.x >= && b.y != )return true;
if (b.y == && b.x >= && a.y != )return false;
if (b.y*a.y <= )return a.y>b.y;
return ((a-o)^(b-o))> 0.0 || (((a-o)^(b-o)) == 0.0 && a.x < b.x);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(ans,,sizeof(ans));
scanf("%d",&n);
ll sum=;
for(int i=;i<n;i++)
{
scanf("%lf%lf%I64d",&xx[i],&yy[i],&val[i]);
p[i]=Point(xx[i],yy[i],val[i]);
sum+=val[i];
}
sort(p,p+n,cmp);
int l=;
ll res;
ans[]+=p[].val;
for(int i=;i<n;i++)
{
if(i>) ans[i]=ans[i-]-p[i-].val;
while(((p[i]-o)^(p[l]-o))>)
{
ans[i]+=p[l].val;
l=(l+)%n;
}
if(i==) res=ans[i]*(sum-ans[i]);
else res=max(res,ans[i]*(sum-ans[i]));
}
printf("%I64d\n",res);
}
return ;
}
极角排序+线性扫模板
【模板】
bool cmp(const Point &a, const Point &b)//先按象限排序,再按极角排序,再按远近排序
{
if (a.y == && b.y == && a.x*b.x <= )return a.x>b.x;
if (a.y == && a.x >= && b.y != )return true;
if (b.y == && b.x >= && a.y != )return false;
if (b.y*a.y <= )return a.y>b.y;
return ((a-o)^(b-o))> 0.0 || (((a-o)^(b-o)) == 0.0 && a.x < b.x);
}
极角排序,o是中心点
int l=;
ll res;
// ans[0]+=p[0].val;
for(int i=;i<n;i++)
{
//if(i>0) ans[i]=ans[i-1]-p[i-1].val;
while(((p[i]-o)^(p[l]-o))>)
{
// 必要的运算
l=(l+)%n;
}
//这里更新答案
}
线性扫
【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge的更多相关文章
- 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...
- 【双向bfs】2017多校训练十 HDU 6171 Admiral
[题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...
- 【思维】2017多校训练七 HDU6121 Build a tree
http://acm.hdu.edu.cn/showproblem.php?pid=6121 [题意] 询问n个结点的完全k叉树,所有子树结点个数的异或和是多少 [思路] 一棵完全K叉树,对于树的每一 ...
- 【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing
acm.hdu.edu.cn/showproblem.php?pid=6060 [题意] 给定一棵以1为根的树,把这颗树除1以外的结点划分为k个集合(可以有空集),把1加入划分后的集合 每个集合的结点 ...
- 【链表】2017多校训练三 HDU 6058 Kanade's sum
acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...
- 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 i ...
- hdu 6127 Hard challenge(极角/角度排序+枚举+结构体排序新写法)
Hard challenge Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) ...
- hdu 6127 : Hard challenge (2017 多校第七场 1008)(计算几何)
题目链接 题意:二维平面上有n个点(没有重叠,都不在原点,任意两点连线不过原点),每个点有一个权值,用一条过原点的直线把他们划分成两部分,使两部分的权值和的乘积最大.输出最大的乘积. 极角排序后,将原 ...
- 2017多校第7场 HDU 6127 Hard challenge 极角排序,双指针
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6127 题意:平面直角坐标系上有n个整点,第i个点有一个点权val,坐标为(xi,yi),其中不存在任 ...
随机推荐
- codevs 1146 ISBN号码
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1 ...
- 栈的应用——Rails
一.题目描述 某城市有一个火车站,有n节车厢从A方向驶入车站,按进站顺序编号为1~n,经中转站C驶向B.中转站C,这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须以相反的顺序驶出C ...
- DAG上的动态规划---嵌套矩形(模板题)
一.DAG的介绍 Directed Acyclic Graph,简称DAG,即有向无环图,有向说明有方向,无环表示不能直接或间接的指向自己. 摘录:有向无环图的动态规划是学习动态规划的基础,很多问题都 ...
- ndarray数组自动创建
为了实现某些运算,需要快速构造符合要求的大数组 Numpy函数生成的数组,如不指定类类型,几乎全为浮点型(arange除外,它是整形),因为科学计算中测量值,例如温度.长度,都是浮点数 import ...
- python基本排序算法(一)
一.冒泡排序 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”. 冒泡排序算法的原理如下: 比 ...
- OpenCV2:第十一章 图像转换
一.简介 二.例子 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #inclu ...
- Python学习笔记2(序列)
元组不可变序列 tuple函数 总结 字符串 基本字符串的操作 字符串格式化 字符串方法 find join lower replace split strip translate 小结 元组:不可变 ...
- (62)zabbix客户端自动注册
1. 概述 上一篇内容<zabbix自动发现配置>,大概内容是zabbix server去扫描一个网段,把在线的主机添加到Host列表中. 我们本篇内容与上篇相反,这次是Active ag ...
- Python旅途——入门基础
1.入门 作为近几年计算机程序设计语言中很火的Python,是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大 ...
- (转)iOS开发之同一应用设置不同图标和名称
本文转自:http://www.devzeng.com/blog/ios-two-version-app-setting-profile.html iOS开发之同一应用设置不同图标和名称 SEP 6T ...