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】

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<cmath>
  6. #include<algorithm>
  7.  
  8. using namespace std;
  9. typedef long long ll;
  10. const int maxn=5e4+;
  11. int n;
  12. double xx[maxn];
  13. double yy[maxn];
  14. ll val[maxn];
  15. ll ans[maxn];
  16.  
  17. double dis(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
  18. const double eps = 1e-;
  19. struct Point
  20. {
  21. double x;
  22. double y;
  23. ll val;
  24. double dis;
  25. double alf;
  26. Point(){}
  27. Point(double _x,double _y):x(_x),y(_y){}
  28. Point(double _x,double _y,ll _val):x(_x),y(_y),val(_val){}
  29. Point operator -(const Point &t) const
  30. {
  31. return Point(x-t.x,y-t.y);
  32. }
  33. double operator ^(const Point &t)const
  34. {
  35. return (x*t.y)-(y*t.x);
  36. }
  37. }p[maxn];
  38. Point o(0.0,0.0);
  39. bool cmp(const Point &a, const Point &b)//先按象限排序,再按极角排序,再按远近排序
  40. {
  41. if (a.y == && b.y == && a.x*b.x <= )return a.x>b.x;
  42. if (a.y == && a.x >= && b.y != )return true;
  43. if (b.y == && b.x >= && a.y != )return false;
  44. if (b.y*a.y <= )return a.y>b.y;
  45. return ((a-o)^(b-o))> 0.0 || (((a-o)^(b-o)) == 0.0 && a.x < b.x);
  46. }
  47.  
  48. int main()
  49. {
  50. int T;
  51. scanf("%d",&T);
  52. while(T--)
  53. {
  54. memset(ans,,sizeof(ans));
  55. scanf("%d",&n);
  56. ll sum=;
  57. for(int i=;i<n;i++)
  58. {
  59. scanf("%lf%lf%I64d",&xx[i],&yy[i],&val[i]);
  60. p[i]=Point(xx[i],yy[i],val[i]);
  61. sum+=val[i];
  62. }
  63. sort(p,p+n,cmp);
  64. int l=;
  65. ll res;
  66. ans[]+=p[].val;
  67. for(int i=;i<n;i++)
  68. {
  69. if(i>) ans[i]=ans[i-]-p[i-].val;
  70. while(((p[i]-o)^(p[l]-o))>)
  71. {
  72. ans[i]+=p[l].val;
  73. l=(l+)%n;
  74. }
  75. if(i==) res=ans[i]*(sum-ans[i]);
  76. else res=max(res,ans[i]*(sum-ans[i]));
  77. }
  78. printf("%I64d\n",res);
  79. }
  80. return ;
  81. }

极角排序+线性扫模板

【模板】

  1. bool cmp(const Point &a, const Point &b)//先按象限排序,再按极角排序,再按远近排序
  2. {
  3. if (a.y == && b.y == && a.x*b.x <= )return a.x>b.x;
  4. if (a.y == && a.x >= && b.y != )return true;
  5. if (b.y == && b.x >= && a.y != )return false;
  6. if (b.y*a.y <= )return a.y>b.y;
  7. return ((a-o)^(b-o))> 0.0 || (((a-o)^(b-o)) == 0.0 && a.x < b.x);
  8. }

极角排序,o是中心点

  1. int l=;
  2. ll res;
  3. // ans[0]+=p[0].val;
  4. for(int i=;i<n;i++)
  5. {
  6. //if(i>0) ans[i]=ans[i-1]-p[i-1].val;
  7. while(((p[i]-o)^(p[l]-o))>)
  8. {
  9. // 必要的运算
  10. l=(l+)%n;
  11. }
  12. //这里更新答案
  13. }

线性扫

【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge的更多相关文章

  1. 【(好题)组合数+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 ...

  2. 【双向bfs】2017多校训练十 HDU 6171 Admiral

    [题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...

  3. 【思维】2017多校训练七 HDU6121 Build a tree

    http://acm.hdu.edu.cn/showproblem.php?pid=6121 [题意] 询问n个结点的完全k叉树,所有子树结点个数的异或和是多少 [思路] 一棵完全K叉树,对于树的每一 ...

  4. 【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing

    acm.hdu.edu.cn/showproblem.php?pid=6060 [题意] 给定一棵以1为根的树,把这颗树除1以外的结点划分为k个集合(可以有空集),把1加入划分后的集合 每个集合的结点 ...

  5. 【链表】2017多校训练三 HDU 6058 Kanade's sum

    acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...

  6. 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 ...

  7. hdu 6127 Hard challenge(极角/角度排序+枚举+结构体排序新写法)

    Hard challenge Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

  8. hdu 6127 : Hard challenge (2017 多校第七场 1008)(计算几何)

    题目链接 题意:二维平面上有n个点(没有重叠,都不在原点,任意两点连线不过原点),每个点有一个权值,用一条过原点的直线把他们划分成两部分,使两部分的权值和的乘积最大.输出最大的乘积. 极角排序后,将原 ...

  9. 2017多校第7场 HDU 6127 Hard challenge 极角排序,双指针

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6127 题意:平面直角坐标系上有n个整点,第i个点有一个点权val​,坐标为(xi,yi),其中不存在任 ...

随机推荐

  1. sqlserver中drop、truncate和delete语句的用法

    虽然小编不建议大家去用命令删除数据库表中的东西,但是这些删除命令总有用的着的地方. 说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用 ...

  2. mongodb主从配置信息查看与确认

    在local库中不仅有主从日志 oplog集合,还有一个集合用于记录主从配置信息 system.replset: > use local > show collections > d ...

  3. 打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例

    今年6月SAP发布C/4HANA之后,有顾问朋友们在微信公众号后台留言,询问C/4HANA如何同SAP的数字化核心S/4HANA系统结合起来,从而打通企业的前后端业务,帮助企业实现数字化转型. 有的顾 ...

  4. 找出指定文件夹中的所有以txt结尾的文件,包括所有嵌套的子文件夹

    # coding:utf-8 import os, re for i in os.walk('d:'+os.sep):     for txt in i[2]:         try:        ...

  5. Open Scene Graph:让VS支持不含后缀的头文件

    让VS支持不含后缀的头文件 看OSG源码时,会遇到不含后缀的头文件无定位信息的尴尬,很让人苦恼. 就是单击VS中“工具菜单栏”——>”选项(O)….”如下图所示: 菜单项,弹出选项对话框,单击“ ...

  6. postman使用--构建工作流和newman

    构建工作流 在使用“Collection Runner”的时候,集合中的请求执行顺序就是请求在Collection中的显示排列顺序.但是,有的时候我们不希望请求按照这样的方式去执行,可能是执行完第一个 ...

  7. [NOI2010]海拔——最小割+对偶图

    题目链接 SOLUTION 想一下最优情况下肯定让平路或下坡尽量多,于是不难想到这样构图:包括左上角的一部分全部为\(0\),包括右下角的一部分全部为\(1\),于是现在问题转化为求那个分界线是什么. ...

  8. SSH中的jar包讲解

    我们在搭建SSH框架的时候,需要引入各自的一些jar包 首先,先来看一下我们使用的SSH的各自版本及引入的jar包.   struts2.3.1.2: struts2-core-2.3.1.jar j ...

  9. UVa 291 The House Of Santa Claus——回溯dfs

    题意:从左下方的1开始,一笔画出圣诞老人的房子. #include <iostream> #include <cstring> using namespace std; ][] ...

  10. 【OS_Linux】Linux系统中目录及文件管理

    1.Linux系统中目录的树状结构 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录, ...