题意:给定 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. python‘s first day for me

    计算机的基础 1,计算机由硬件及软件组成. 其中硬件主要包括了cpu,内存以及硬盘.软件则由操作系统以及一系列软件. 操作系统则可以操控硬件,使硬件完成一些需要的操作. python的历史 1989年 ...

  2. FastJSON 转换List<T> ,Map<T,T>泛型失败 处理方法

    dictDataMap = JSON.parseObject(dictAllCacheResult,new TypeReference<Map<String, DictionaryData ...

  3. python写个Hack Scan

    前言: 之前逛SAFEING极客社区的时候 发现一款黑市卖2000多的软件,后面下载了 打不开.发现config文件里面有些不错的东西.总结了一下 有了以下的脚本. 脚本用处: [1]探测CMS(不敢 ...

  4. Dev使用技巧汇总

    C# XtraGrid的行指示器(RowIndicator)行号以及图标设置 参考网址:https://www.cnblogs.com/xuliangxing/p/6775438.html DateE ...

  5. 通过Java代码装配Bean

    上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ...

  6. .net Reactor之限指定设备使用

    .net Reactor之license限指定设备使用 上一篇(https://www.cnblogs.com/s313139232/p/9908400.html)中记录了.net Reactor对d ...

  7. mongodb Java(八)

    package com.mongodb.text; import java.net.UnknownHostException; import com.mongodb.DB; import com.mo ...

  8. leetcode914

    public class Solution { public bool HasGroupsSizeX(int[] deck) { var len = deck.Length; ; i <= le ...

  9. 跟着太白老师学python day10 名称空间,作用域和取值顺序,变量的加载顺序

    名称空间分为3种: 1. 全局名称空间 2. 内置名称空间 3. 局部名称空间(临时) 作用域 全局作用域              1全局名称空间 2 内置名称空间 局部作用域           ...

  10. 给虚拟机添加eth1网络适配器(网卡)

    1.虚拟机 -- > 设置 2.添加 --> 网络适配器 --> 下一步 3.主机 -- > 完成 -- > 确定 4.修改网卡的配置文件 cd /etc/sysconf ...