博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gym 101128J Saint John Festival(凸包 + 二分判点和凸包关系)题解
阅读量:6426 次
发布时间:2019-06-23

本文共 1727 字,大约阅读时间需要 5 分钟。

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

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

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

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 1e4 + 10;const int M = maxn * 30;const ull seed = 131;const int INF = 0x3f3f3f3f;const int MOD = 1000000007;struct point{ double x,y;}p[100000],a[100000],b[100000], g;int n, tot;bool cmp(point A,point B){ if(A.x!=B.x) return A.x
1&&cross(p[tot-1]-p[tot-2],a[i]-p[tot-2])<=0)tot--; p[tot++]=a[i]; } int k=tot; for(int i=n-1;i>0;i--) { while(tot>k&&cross(p[tot-1]-p[tot-2],a[i]-p[tot-2])<=0)tot--; p[tot++]=a[i]; } if(n>1)tot--;}double turn(point st, point en, point q){ //正数:点在向量左侧 //负数:点在向量右侧 //0:点在向量直线上 return (st.x - q.x) * (en.y - q.y) - (en.x - q.x) * (st.y - q.y);}int mid(){ int l, r; l = 1, r = tot - 2; while(l <= r){ int m = (l + r) >> 1; if(turn(p[0], p[m], g) >= 0 && turn(p[0], p[m + 1], g) <= 0){ if(turn(p[m], p[m + 1], g) >= 0) return 1; return 0; } if(turn(p[0], p[m], g) >= 0){ l = m + 1; } else{ r = m - 1; } } return 0;}int main(){ int m; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%lf%lf", &a[i].x, &a[i].y); sort(a+1,a+1+n,cmp); dopack();// for(int i = 0; i < tot; i++){// printf("* %lf %lf\n", p[i].x, p[i].y);// } scanf("%d", &m); int ans = 0; for(int i = 1; i <= m; i++){ scanf("%lf%lf", &g.x, &g.y); ans += mid(); } printf("%d\n", ans); return 0;}

 

转载于:https://www.cnblogs.com/KirinSB/p/10821551.html

你可能感兴趣的文章
cgroup 介绍 与使用
查看>>
dwz表单提交响应
查看>>
我的友情链接
查看>>
Linux 下mail 的简单使用
查看>>
DNS解析过程
查看>>
对容器、迭代器的理解
查看>>
忘记mysql root密码的修改方法
查看>>
MFC小结
查看>>
2018年终总结
查看>>
oracle修改varchar2为number
查看>>
Linux C 文件的输入/输出操作
查看>>
Android 进程和服务相关资料
查看>>
线程优先级
查看>>
在ubuntu14.04上使用ambari搭建hadoop集群
查看>>
[paramiko] recv的时候总是出现timeout的错误
查看>>
Spark算子:RDD基本转换操作(6)–zip、zipPartitions
查看>>
【就是快】10分钟搭建一台web服务器!
查看>>
kickstart无人值守安装系统
查看>>
flashbuilder4.7破解
查看>>
开始我的IT职业生涯
查看>>