【bzoj5008】方师傅的房子 计算几何
题目描述
给出一个凸多边形,多次询问某个点是否在这个凸多边形的内部,强制在线。
输入
输出
样例输入
4
-2 -2
2 -2
2 2
-2 2
3
5 5
4 4
0 3
样例输出
1
题解
计算几何的经典应用
固定一个点,将其它的点与它的连线按照极角排序,将多边形三角剖分。
然后查询一个点是否在多边形内部,首先与固定的点连线,找到极角的前驱后继,问题转化为判断是否在前驱后继以及固定点围成的三角形内。可以通过求面积的方法来判断。
然而我这个傻逼写了set。。。还选了最低的点。。。其实不必要的。。。
时间复杂度$O(n\log n)$
#include <set>
#include <cmath>
#include <cstdio>
#include <utility>
using namespace std;
typedef pair<double , int> pr;
set<pr> s;
set<pr>::iterator it;
double px[100010] , py[100010] , vx , vy = 1e10;
inline double calc(double x1 , double y1 , double x2 , double y2)
{
return fabs(x1 * y2 - x2 * y1);
}
bool judge(double x , double y)
{
int p , q;
it = s.lower_bound(pr(atan2(y - vy , x - vx) , 0));
if(it == s.end() || it == s.begin()) return 0;
p = it->second , q = (--it)->second;
return fabs(calc(px[p] - vx , py[p] - vy , px[q] - vx , py[q] - vy)
- calc(px[p] - x , py[p] - y , px[q] - x , py[q] - y)
- calc(px[p] - x , py[p] - y , vx - x , vy - y)
- calc(px[q] - x , py[q] - y , vx - x , vy - y)) < 1e-8;
}
int main()
{
int n , m , i , last = 1 , ans = 0;
double lx = 0 , ly = 0 , x , y;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%lf%lf" , &px[i] , &py[i]);
if(vy > py[i]) vx = px[i] , vy = py[i];
}
for(i = 1 ; i <= n ; i ++ )
s.insert(pr(atan2(py[i] - vy , px[i] - vx) , i));
scanf("%d" , &m);
while(m -- )
{
scanf("%lf%lf" , &x , &y);
if(last) lx += x , ly += y;
else lx -= x , ly -= y;
last = judge(lx , ly) , ans += last;
}
printf("%d\n" , ans);
return 0;
}
【bzoj5008】方师傅的房子 计算几何的更多相关文章
- bzoj5008: 方师傅的房子
Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形 ,原点一定严格在凸多边形内部.有m个人也到了这个二维平面.现在你得到了m个 ...
- 【BZOJ5008】方师傅的房子 三角剖分
[BZOJ5008]方师傅的房子 Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形,原点一定严格在凸多边形内部.有m个人也到 ...
- 【刷题】BZOJ 5008 方师傅的房子
Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形 ,原点一定严格在凸多边形内部.有m个人也到了这个二维平面.现在你得到了m个 ...
- 2014 UESTC暑前集训数据结构专题解题报告
A.Islands 这种联通块的问题一看就知道是并查集的思想. 做法:从高水位到低水位依序进行操作,这样每次都有新的块浮出水面,可以在前面的基础上进行合并集合的操作.给每个位置分配一个数字,方便合并集 ...
- 2014 UESTC暑前集训动态规划专题解题报告
A.爱管闲事 http://www.cnblogs.com/whatbeg/p/3762733.html B.轻音乐同好会 C.温泉旅馆 http://www.cnblogs.com/whatbeg/ ...
- Contest20140705 testB DP
testB 输入文件: testB.in 输出文件testB.out 时限2000ms 问题描述: 方师傅有两个由数字组成的串 a1,a2,⋯,an 和 b1,b2,⋯,bm.有一天,方师傅感到十分无 ...
- UESTC_神秘绑架案 CDOJ 881
神秘绑架案 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...
- Markdown 编写技巧汇总(一)
编写文档,有很多格式选择,也有不同平台选择.下面就自己接触到的MarkDown编写文档的各种技巧做简单梳理,供自己参阅,也希望帮到网友. [1]添加空格 ① 这种写法比较老土,但是,很实用!注意都 ...
- 计算几何-凸包-toleft test
toLeftTest toLeftTest是判断一个点是否在有向直线左侧的算法. 当点s位于向量pq左侧时,toLeftTest返回true.当点s位于向量pq右侧时,toLeftTest返回fals ...
随机推荐
- Linux getcwd()的实现
通过getcwd()可以获取当前工作目录. #include <unistd.h> char *getcwd(char *cwdbuf, size_t size); 成功调用返回指向cwd ...
- [Jmeter]用Jmeter做压力测试(分布式)
Jmeter 是Java应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误.为了让jmeter工具提 ...
- 2019年猪年海报PSD模板-第四部分
14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1WUO4L5PHIHG5hAurv52_2A
- XSS--编码绕过,qcms,鲶鱼cms
一.编码绕过 1)HTML进制编码 标签中的某些属性值可以使用html十进制.十六进制表示 2)JavaScript编码 JavaScript支持unicode.八进制.十六进制.十进制等 3)URL ...
- HDU - 6440(费马小定理)
链接:HDU - 6440 题意:重新定义加法和乘法,使得 (m+n)^p = m^p + n^p 成立,p是素数.,且satisfied that there exists an integer q ...
- 拥抱移动端,jQueryui触控设备兼容插件
http://touchpunch.furf.com/ ps:要FQ. jQuery UI Touch Punch Touch Event Support for jQuery UI Tested o ...
- Python3 Tkinter-Canvas
1.创建 from tkinter import * root=Tk() cv=Canvas(root,bg='black') cv.pack() root.mainloop() 2.创建item f ...
- [C++] OOP - Access Control and Class Scope
Access Control And Inheritance Protected Member Like private, protected members are unaccessible to ...
- 20145214实验五 Java网络编程及安全
20145214实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我的结对伙伴是 20145219 宋歌,我负责的 ...
- c# 四则运算出错
不同类型值之间不可直接相减,long和short得出的差继续参与运算出错. 有待深究.