【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司机第三组奖励政策
-8月9日更新- 优步杭州第三组: 定义为激活时间在2015/8/3之后(含)的车主(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Ub ...
- Java:xxx is not an enclosing class
1. 错误原因 该错误一般出现在对内部类进行实例化时,例如 public class A{ public class B{ } } 此时B是A的内部类,如果我们要使用如下语句实例化一个B类的对象: A ...
- Tomcat7后台通过get接收数据处理乱码
Tomcat7后台通过get接收数据处理乱码 //因为tomcat7 默认将用get传来的数据用ISO-8859-1封装, //将ajax传过来的值解码,再转码,//因为tomcat7 默认将用get ...
- Centos 7 快速安装 Docker
摘要: 安装 Docker [root@localhost~]# yum install docker 启动 docker 服务 [root@localhost~]# systemctl start ...
- Android开发-API指南-<permission-tree>
<permission-tree> 英文原文:http://developer.android.com/guide/topics/manifest/permission-tree-elem ...
- [Clr via C#读书笔记]Cp7常量和字段
Cp7常量和字段 常量 常量在编译的时候必须确定,只能一编译器认定的基元类型.被视为静态,不需要static:直接嵌入IL中: 区别ReadOnly 只能在构造的时候初始化,内联初始化. 字段 数据成 ...
- ES6 之 let / const
本博文配合 阮一峰 <ES6 标准入门(第3版)>一书进行简要概述 ES6 中的 let 与 const. 历史遗留问题 由于 JS ES3语法中的 var 提升变量.没有块级作用域,因而 ...
- 怎么用js精确判断li已经在ul存在过了?
<ul class="memory_messagelist" id="memory_messagelist"> <li><span ...
- 【转】Angular.js VS. Ember.js:谁将成为Web开发的新宠?
本文源自于Quora网站的一个问题,作者称最近一直在为一个新的Rails项目寻找一个JavaScript框架,通过筛选,最终纠结于 Angular.js和 Ember.js. 这个问题获得了大量的关注 ...
- cookie,localstorge,sessionstorge三者总结
相同点:都是客户端存储东西的: 不同: 1大小,cookie最小;locastorge最大 2 cookie设置好会在header头里面自动带的:但是ls和ss不会:ls同个浏览下不同网页(非跨域)都 ...