【极角排序+双指针线性扫】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),其中不存在任 ...
随机推荐
- Windows Server 2008 R2中上传和下载文件
在 Windows Server 2008 R2 中,使用服务器管理器来启用或禁用 Windows 功能,那在这个上面如何上传和下载文件呢? 1.在“服务器管理器”->“角色”->“web ...
- 易混淆的table列表和dl表格
dl列表是使用了HTML dl.dt.dd标签的数据列表.首先我们使用dl(definition list-自定义列表)标签来容纳整个数据结构,然后我们使用dt(自定义标题)标签和dd(自定义描述)标 ...
- false - (失败的)什么都不做
总览 (SYNOPSIS) false [忽略命令行参数] false OPTION 描述 (DESCRIPTION) 程序 结束 时, 产生 表示 失败 的 状态码. 下列的 选项 没有 简写 形式 ...
- SQLyog连接数据库 提示错误plugin caching_sha2_password could not be loaded
1.打开mysql cmd 2.执行语句 ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; # ...
- quartz测试类
package demo.mytest; import java.text.ParseException; import org.quartz.CronTrigger;import org.quart ...
- ★房贷计算器 APP
一.目的 1. 这是一个蛮有用的小工具 2. 之前看了很多demo,第一次来完全的自己实现一个APP 3. 完成之后提交 App Store 4. 作为Good Coder的提交审核材料 二.排期 周 ...
- Leetcode 7 反转整数Reverse Integer
给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: ...
- Hdu 3177 (贪心)
题目大意: 山洞的体积为\(v\) 第\(i\)个物品放在山洞里会占据\(a_i\)的空间,在搬运过程中至少需要\(b_i\)的空间 问能不能把所有物品都放下 贪心题.比较难看出贪心,但是从无顺序要求 ...
- 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列
hash大法好(@ARZhu):大数相乘及时取模真的是件麻烦事情 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次 ...
- Python的第3堂课
20181119笔记 一.内存管理相关 ①Cpython解释器的垃圾回收机制 什么是垃圾:当一个值没有被绑定任何变量名(即该值的引用计数为零时),该值就是垃圾. 垃圾回收是收回值占用的内存空间. 引用 ...