发现需要求一个下凸的半平面上有几个交点。

然后我们把它变成凸包的问题。

好写、好调、还没有精度误差。

  1. #include <map>
  2. #include <ctime>
  3. #include <cmath>
  4. #include <queue>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <iostream>
  8. #include <algorithm>
  9. using namespace std;
  10. #define F(i,j,k) for (int i=j;i<=k;++i)
  11. #define D(i,j,k) for (int i=j;i>=k;--i)
  12. #define ll long long
  13.  
  14. struct Vector{
  15. int x,y;
  16. void print()
  17. {
  18. printf("Vector - > (%d,%d)\n",x,y);
  19. }
  20. };
  21.  
  22. struct Point{
  23. int x,y;
  24. int id;
  25. void print()
  26. {
  27. printf("Point ID %d (%d,%d)\n",id,x,y);
  28. }
  29. };
  30.  
  31. Vector operator - (Point a,Point b)
  32. {Vector ret;ret.x=a.x-b.x;ret.y=a.y-b.y;return ret;}
  33.  
  34. ll operator * (Vector a,Vector b)
  35. {return (ll)a.x*b.y-(ll)a.y*b.x;}
  36.  
  37. int n,top=0;
  38. Point a[50005],sta[50005];
  39.  
  40. bool cmp(Point a,Point b)
  41. {return a.x==b.x?a.y<b.y:a.x<b.x;}
  42. bool cmp2(Point a,Point b)
  43. {return a.id<b.id;}
  44. void Andrew()
  45. {
  46. F(i,1,n)
  47. if (a[i].x!=a[i-1].x){
  48. while (top>=2&&(sta[top]-sta[top-1])*(a[i]-sta[top])<=0) top--;
  49. sta[++top]=a[i];
  50. }
  51. sort(sta+1,sta+top+1,cmp2);
  52. F(i,1,top) printf("%d ",sta[i].id);
  53. printf("\n");
  54. }
  55.  
  56. void Finout()
  57. {
  58. freopen("bzoj_1007.in","r",stdin);
  59. freopen("bzoj_1007.out","w",stdout);
  60. }
  61.  
  62. int main()
  63. {
  64. // Finout();
  65. scanf("%d",&n);
  66. F(i,1,n)
  67. {
  68. scanf("%d%d",&a[i].x,&a[i].y);
  69. a[i].y=-a[i].y;
  70. a[i].id=i;
  71. }
  72. sort(a+1,a+n+1,cmp);
  73. Andrew();
  74. }

  

BZOJ 1007 [HNOI2008]水平可见直线 ——半平面交 凸包的更多相关文章

  1. 2018.07.03 BZOJ 1007: [HNOI2008]水平可见直线(简单计算几何)

    1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Description 在xoy直角坐标平面上有n条直线L1,L2,-Ln, ...

  2. bzoj 1007 [HNOI2008]水平可见直线(单调栈)

    1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5120  Solved: 1899[Submit][Sta ...

  3. BZOJ 1007 [HNOI2008]水平可见直线

    1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4453  Solved: 1636[Submit][Sta ...

  4. BZOJ 1007 [HNOI2008]水平可见直线 (栈)

    1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7940  Solved: 3030[Submit][Sta ...

  5. BZOJ 1007: [HNOI2008]水平可见直线 栈/计算几何

    1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec  Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  6. BZOJ 1007: [HNOI2008]水平可见直线 平面直线

    1007: [HNOI2008]水平可见直线 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则 ...

  7. bzoj 1007: [HNOI2008]水平可见直线 半平面交

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=1007; 题解 其实就是求每条直线的上半部分的交 所以做裸半平面交即可 #include ...

  8. [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.     例如,对于直线:   ...

  9. 【bzoj1007】[HNOI2008]水平可见直线 半平面交/单调栈

    题目描述 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=- ...

随机推荐

  1. Android 8.0 NotificationChannel 采坑实例

    Android O 上Notification的新特性: 通知通道功能 1. 简介: 通知通道功能使开发者管理自己应用的通知成为一个组或者一个通道,用户可以通过通知通道完成设置通知,如:阻止所有通知, ...

  2. codevs 1145 Hanoi双塔问题 2007年NOIP全国联赛普及组

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的 ...

  3. 51nod 1212 无向图最小生成树(Kruskal模版题)

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树.   Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 &l ...

  4. 洛谷 P2347 砝码称重 != codevs 2144

    题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝 ...

  5. X11/Xlib.h: No such file or directory

    CentOS 编译一些开源项目提示:X11/Xlib.h: No such file or directory. 运行命令:yum install libX11-devel就可以了.

  6. git 添加 ,密匙

    转载此处   https://blog.csdn.net/xiayiye5/article/details/79652296

  7. 自动发表QQ空间说说

    require("gb2312toutf8") local http = require "socket.http" local surl = "ht ...

  8. VC-基础:关于一些符号的意义

    GUI应用程序:Graphic User Interface图形 用户 接口 SDI:单文档程序(典型的记事本就是SDI) MID:多文档程序(比如VS2008默认就是多文档的)

  9. go get 升级所有

    go get -u all go get -u go mod update go get -u full_package_name    go get -u github.com/... // ('. ...

  10. 删除链表的倒数第N个节点(三种方法实现)

    删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒 ...