【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 ...
随机推荐
- 成都Uber优步司机奖励政策(1月7日)
1月7日 奖励政策 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblog ...
- Ubuntu 安装 搜狗输入法
1.去下载搜狗输入法安装包: https://pinyin.sogou.com/linux/ 2.安装 sudo dpkg sougou****.deb 3.去设置 参考:https://blog.c ...
- Linux命令非常全
最近都在和Linux打交道,感觉还不错.这也是很多人喜欢linux的原因,比较短小但却功能强大.我将我了解到的命令列举一下,仅供大家参考: 系统信息 arch 显示机器的处理器架构(1) uname ...
- jsp传递参数的四种方法
1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="index.jsp"?a= ...
- 基于Docker的UI自动化初探
本文来自网易云社区 前言 一直以来,项目迭代的时间都是比较紧张的,开发加班加点coding,测试加班加点提bug.都说"时间像海绵里的水,挤挤总会有的"(当然这里的"挤挤 ...
- 了解和分析iOS Crash
WeTest 导读 北京时间凌晨一点,苹果一年一度的发布会如期而至.新机型的发布又会让适配相关的同学忙上一阵子啦,并且iOS Crash的问题始终伴随着移动开发者.本文将从三个阶段,由浅入深的介绍如何 ...
- 多台服务器下同步文件夹数据(rsync+inotify)
网上有很多讲解rsync+inotify的教程,我就先贴出一个来大家去看吧,基本都是类似的. http://www.jb51.net/article/57011.htm 我就强调几点,按照上面的方法配 ...
- PS 去皱纹
1.打开一个有皱纹的图片,选择修复画笔工具,按住Alt键吸取一块光滑的皮肤,然后再在有皱纹的位置上点击即可
- 180602-nginx多域名配置
文章链接:https://liuyueyi.github.io/hexblog/2018/06/02/180602-nginx多域名配置/ nginx多域名配置 原来的域名过期了,重新买了一个hhui ...
- git配置github链接
1.百度git官网-下载最新版git 2.一路默认下一步安装 3.打开 git bash here 命令行 4.注册github账号(用自己的邮箱就可以,不会英文可以用谷歌翻译)注册成功后建立项目 5 ...