题意:给你一堆黑点一堆红点,问你有最多几个黑点能找到三个红点,使这个黑点在三角形内?

思路:显然红点组成的凸包内的所有黑点都能做到。但是判断黑点和凸包的关系朴素方法使O(n^2),显然超时。那么我现在有一个更好的方法判断点和凸包的关系。我固定一个红点,然后找连续两个红点使黑点 i 在这个三角形内(向量判),然后用二分查找是否存在这样的两个连续红点。这样复杂度为nlogn。

注意凸包不要用atan2的那种,会有精度误差...

代码:

  1. #include<cmath>
  2. #include<set>
  3. #include<map>
  4. #include<queue>
  5. #include<cstdio>
  6. #include<vector>
  7. #include<cstring>
  8. #include <iostream>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. typedef unsigned long long ull;
  13. const int maxn = 1e4 + 10;
  14. const int M = maxn * 30;
  15. const ull seed = 131;
  16. const int INF = 0x3f3f3f3f;
  17. const int MOD = 1000000007;
  18. struct point
  19. {
  20. double x,y;
  21. }p[100000],a[100000],b[100000], g;
  22. int n, tot;
  23. bool cmp(point A,point B)
  24. {
  25. if(A.x!=B.x)
  26. return A.x<B.x;
  27. return A.y<B.y;
  28. }
  29. point operator -(point A,point B)
  30. {
  31. point c;
  32. c.x=A.x-B.x;
  33. c.y=A.y-B.y;
  34. return c;
  35. }
  36. double cross(point A,point B)
  37. {
  38. return A.x*B.y-B.x*A.y;
  39. }
  40. void dopack()
  41. {
  42. tot=0;
  43. for(int i=1;i<=n;i++)
  44. {
  45. while(tot>1&&cross(p[tot-1]-p[tot-2],a[i]-p[tot-2])<=0)tot--;
  46. p[tot++]=a[i];
  47. }
  48. int k=tot;
  49. for(int i=n-1;i>0;i--)
  50. {
  51. while(tot>k&&cross(p[tot-1]-p[tot-2],a[i]-p[tot-2])<=0)tot--;
  52. p[tot++]=a[i];
  53. }
  54. if(n>1)tot--;
  55. }
  56. double turn(point st, point en, point q){
  57. //正数:点在向量左侧
  58. //负数:点在向量右侧
  59. //0:点在向量直线上
  60. return (st.x - q.x) * (en.y - q.y) - (en.x - q.x) * (st.y - q.y);
  61. }
  62. int mid(){
  63. int l, r;
  64. l = 1, r = tot - 2;
  65. while(l <= r){
  66. int m = (l + r) >> 1;
  67. if(turn(p[0], p[m], g) >= 0 && turn(p[0], p[m + 1], g) <= 0){
  68. if(turn(p[m], p[m + 1], g) >= 0) return 1;
  69. return 0;
  70. }
  71. if(turn(p[0], p[m], g) >= 0){
  72. l = m + 1;
  73. }
  74. else{
  75. r = m - 1;
  76. }
  77. }
  78. return 0;
  79. }
  80. int main(){
  81. int m;
  82. scanf("%d", &n);
  83. for(int i = 1; i <= n; i++)
  84. scanf("%lf%lf", &a[i].x, &a[i].y);
  85. sort(a+1,a+1+n,cmp);
  86. dopack();
  87. // for(int i = 0; i < tot; i++){
  88. // printf("* %lf %lf\n", p[i].x, p[i].y);
  89. // }
  90. scanf("%d", &m);
  91. int ans = 0;
  92. for(int i = 1; i <= m; i++){
  93. scanf("%lf%lf", &g.x, &g.y);
  94. ans += mid();
  95. }
  96. printf("%d\n", ans);
  97. return 0;
  98. }

Gym 101128J Saint John Festival(凸包 + 二分判点和凸包关系)题解的更多相关文章

  1. 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival

    平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后 ...

  2. Saint John Festival Gym - 101128J (凸包二分)

    Problem J: Saint John Festival \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出\(n\)个大点,和\(m\ ...

  3. UVALive 7281 Saint John Festival (凸包+O(logn)判断点在凸多边形内)

    Saint John Festival 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/J Description Porto's ...

  4. UVA - 13024 Saint John Festival 凸包+二分

    题目链接:https://vjudge.net/problem/UVA-13024 题意:先给出\(L\)个点构造一个凸包,再给出\(S\)个点,询问有几个点在凸包内. 题解:判断点是否在凸包内的模板 ...

  5. UVA 13024: Saint John Festival(凸包+二分 ,判定多个点在凸包内)

    题意:给定N个点,Q次询问,问当前点知否在N个点组成的凸包内. 思路:由于是凸包,我们可以利用二分求解. 二分思路1:求得上凸包和下凸包,那么两次二分,如果点在对应上凸包的下面,对应下凸包的上面,那么 ...

  6. 15-16 ICPC europe J Saint John Festival (graham扫描法+旋转卡壳)

    题意:给n个大点,m个小点$(n<=1e5,m<=5e5),问有多少个小点,存在3个大点,使小点在三个大点组成的三角形内. 解题思路: 首先,易证,若该小点在某三大点行成的三角形内,则该小 ...

  7. 【bzoj3203】[Sdoi2013]保护出题人 凸包+二分

    题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的 ...

  8. 【bzoj2402】陶陶的难题II 分数规划+树链剖分+线段树+STL-vector+凸包+二分

    题目描述 输入 第一行包含一个正整数N,表示树中结点的个数.第二行包含N个正实数,第i个数表示xi (1<=xi<=10^5).第三行包含N个正实数,第i个数表示yi (1<=yi& ...

  9. 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)

    layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...

随机推荐

  1. 利用JavaUDPSocket+多线程模拟实现一个简单的聊天室程序

    对Socket的一点个人理解:Socket原意是指插座.家家户户都有五花八门的家用电器,但它们共用统一制式的插座.这样做的好处就是将所有家用电器的通电方式统一化,不需要大费周章地在墙壁上凿洞并专门接电 ...

  2. 上海某小公司面试题:synchronized锁原理

    synchronized锁是Java面试的过程中比较常考的知识点了,从偏向锁->轻量级锁->重量级锁都可以聊 CAS在这篇没有讲述,因为在上一篇已经写了,有兴趣的同学可以翻翻开 目前已经连 ...

  3. Windows下的python虚拟环境设置

    Windows下的python虚拟环境设置: virtualenv 在python开发中,我们可能会遇到一种情况:就是当前的项目依赖的是某一个版本,但是另一个项目依赖的是另一个版本,这样就会造成依赖冲 ...

  4. Docker镜像仓库Harbor安装

    export VERSION=18.06 && curl -fsSL http://rainbond-pkg.oss-cn-shanghai.aliyuncs.com/releases ...

  5. MySQL如何加锁控制并发

    目录 前言 一.乐观锁 添加version字段 二.悲观锁 读锁 全表锁(LOCK TABLE 表 READ) 行锁(SELECT ... LOCK IN SHARE MODE) 写锁 全表锁(LOC ...

  6. jackson学习之四:WRAP_ROOT_VALUE(root对象)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. muduo 网络库的整体架构图和一个简化版本的架构设计

    https://blog.csdn.net/adkada1/article/details/54342275 简析 https://blog.csdn.net/amoscykl/article/det ...

  8. react空标签之The React Fragment

    如何使用React.Fragment创建不可见的HTML标签 在研究Ant Design Pro项目中,在登录模块中,有React.Fragment的实际应用 接下来先看一个小demo,将返回值包装在 ...

  9. (十八)整合Nacos组件,环境搭建和入门案例详解

    整合Nacos组件,环境搭建和入门案例详解 1.Nacos基础简介 1.1 关键特性 1.2 专业术语解释 1.3 Nacos生态圈 2.SpringBoot整合Nacos 2.1 新建配置 2.2 ...

  10. yuan先生博客地址

    1 Web应用  https://www.cnblogs.com/yuanchenqi/articles/8869302.html2 http协议 https://www.cnblogs.com/yu ...