题意:给定 n 个点,和权值,他们两两相连,每条边的权值就是他们两个点权值的乘积,任意两点之间的直线不经过原点,让你从原点划一条直线,使得经过的直线的权值和最大。

析:直接进行极角扫描,从水平,然后旋转180度,就可以计算出一个最大值,因为题目说了任意直线不是经过原点的,所以就简单了很多,每次碰到的肯定是一个点,而不是多个点。

代码如下:

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <iostream>
  7. #include <cstring>
  8. #include <set>
  9. #include <queue>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <map>
  13. #include <cctype>
  14. #include <cmath>
  15. #include <stack>
  16. #include <sstream>
  17. #include <list>
  18. #define debug() puts("++++");
  19. #define gcd(a, b) __gcd(a, b)
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define freopenr freopen("in.txt", "r", stdin)
  23. #define freopenw freopen("out.txt", "w", stdout)
  24. using namespace std;
  25.  
  26. typedef long long LL;
  27. typedef unsigned long long ULL;
  28. typedef pair<int, int> P;
  29. const int INF = 0x3f3f3f3f;
  30. const double inf = 1e20;
  31. const double PI = acos(-1.0);
  32. const double eps = 1e-8;
  33. const int maxn = 1e5 + 10;
  34. const int mod = 10;
  35. const int dr[] = {-1, 0, 1, 0};
  36. const int dc[] = {0, 1, 0, -1};
  37. const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
  38. int n, m;
  39. const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  40. const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  41. inline bool is_in(int r, int c) {
  42. return r > 0 && r <= n && c > 0 && c <= m;
  43. }
  44.  
  45. struct Node{
  46. int x, y, val;
  47. double v;
  48. };
  49. Node a[maxn];
  50.  
  51. struct Point{
  52. double v;
  53. int id;
  54. Point(){ }
  55. Point(double vv, int i) : v(vv), id(i) { }
  56. bool operator < (const Point &p) const{
  57. return v < p.v;
  58. }
  59. };
  60.  
  61. vector<Point> v;
  62.  
  63. int main(){
  64. int T; cin >> T;
  65. while(T--){
  66. scanf("%d", &n);
  67. v.clear();
  68. LL up = 0, down = 0;
  69. for(int i = 1; i <= n; ++i){
  70. scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].val);
  71. if(a[i].y < 0) down += a[i].val;
  72. else if(a[i].y > 0) up += a[i].val;
  73. else if(a[i].x < 0) up += a[i].val;
  74. else down += a[i].val;
  75. a[i].v = atan2(a[i].y, a[i].x);
  76. if(a[i].v < 0.0) v.push_back(Point(a[i].v + PI, i));
  77. else v.push_back(Point(a[i].v, i));
  78. }
  79. v.push_back(Point(0, 0));
  80. sort(v.begin(), v.end());
  81. LL ans = up * down;
  82.  
  83. for(int i = 1; i < v.size(); ++i){
  84. if(v[i].v == v[i-1].v) continue;
  85. if(a[v[i].id].v >= 0.0){
  86. up -= a[v[i].id].val;
  87. down += a[v[i].id].val;
  88. }
  89. else {
  90. up += a[v[i].id].val;
  91. down -= a[v[i].id].val;
  92. }
  93. ans = max(ans, up * down);
  94. }
  95. printf("%I64d\n", ans);
  96. }
  97. return 0;
  98. }

  

HDU 6127 Hard challenge (极角扫描)的更多相关文章

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

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

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

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

  3. 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

    acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...

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

  5. HDU 6127 Hard challenge(扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=6127 题意: 有n个点,每个点有一个$(x,y)$坐标和一个权值,任意两点之间都有连线,并且连线的权值为两个顶点 ...

  6. HDU - 6127: Hard challenge(扫描线,atan)

    pro:给定N个二维平面的关键点,保证两点连线不经过原点.现在让你安排一条经过原点,但是不经过关键点的直线,使得两边的和的乘积最大. sol:由于连线不经过原点,所以我们极角排序即可. 具体:因为我们 ...

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

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

  8. HDU 5738 Eureka(极角排序)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5738 [题目大意] 给出平面中一些点,在同一直线的点可以划分为一个集合,问可以组成多少包含元素不少 ...

  9. HDU Always Cook Mushroom (极角排序+树状数组)

    Problem Description Matt has a company, Always Cook Mushroom (ACM), which produces high-quality mush ...

随机推荐

  1. oracle监听动态注册与静态注册

    client端如果想要连接到远程的数据库服务器,首先数据库服务器必须启动监听器 oracle监听器的配置在$ORACLE_HOME/network/admin/listener.ora,打开这个文件, ...

  2. apt-get upgarde 和dist-upgrade的差别

    Debian/Ubuntu Linux都使用apt,升级时都是: apt-get update apt-get upgrade apt-get dist-upgrade 安装或升级系统分下面几个步骤. ...

  3. 使用国内源部署ceph

    由于网络方面的原因,Ceph的部署经常受到干扰,通常为了加速部署,基本上大家都是将Ceph的源同步到本地进行安装.根据Ceph中国社区的统计,当前已经有国内的网站定期将Ceph安装源同步,极大的方便了 ...

  4. 修改tomcat端口后不能IP访问问题

    当tomcat端口被修改以后使用IP访问会发生404的问题,只能通过localhost进行访问,当别人想访问你tomcat下的工程时就会访问失败,此时修改eclipse下的tomcat中的server ...

  5. django之设置分页

    分页 Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据, ...

  6. JVM常用参数设置

    堆内存设置 示例: java -Xmx4550m -Xms4550m -Xss128k -XX:NewRatio=5 -XX:SurvivorRatio=5 -Xmx4550m:设置JVM最大可用内存 ...

  7. 关于电机驱动扩展板 L293D 马达板Arduino

    注意端口3,4,5,6,7,8,9,10,11,12会被占用(板子上的pin口). 通过 MS_DCMotor motor(4); 中的4指的是4号电机,同理还有1-3号电机.不是pin口   舵机用 ...

  8. Django templates 和 urls 拆分

    如果在Django项目 下面新建了blog和polls两个APP应用,在每个APP下面都各自新建自己的url和templates,那么我们需要如何进行项目配置呢? INSTALLED_APPS = [ ...

  9. Spring oxm入门实例

    O/XMapper是什么? Spring3.0的一个新特性是O/XMapper.O/X映射器这个概念并不新鲜,O代表Object,X代表XML.它的目的是在Java对象(几乎总是一个plainoldJ ...

  10. 引用rtmp编译报错:rtmp.obj : error LNK2001: 无法解析的外部符号 __imp__timeGetTime@0

    如题vs下引用librtmp的时候报错:rtmp.obj : error LNK2001: 无法解析的外部符号 __imp__timeGetTime@0 在link 里加入 winmm.lib 就可以 ...