题目描述

给出一个凸多边形,多次询问某个点是否在这个凸多边形的内部,强制在线。

输入

第一行一个数n,接下来n行,每行两个整数x,y。输入按照逆时针顺序输入一个凸包。  
接下来一个数m,最后有m行,第一行两个整数 x,y,表示第一个人的坐标。
对于第i个询问(i>=2) ,输入两个数dx,dy。
如果上一个人在房子内部,x[i]=x[i-1]+dx,y[i]=y[i-1]+dy。否则x[i]=x[i-1]-dx,y[i]=y[i-1]-dy。
n <= 100000, m <= 200000,输入保证所有人的坐标,房屋的坐标都在[-1e9,1e9]之内。

输出

输出一个数,在房子内部人的个数。

样例输入

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】方师傅的房子 计算几何的更多相关文章

  1. bzoj5008: 方师傅的房子

    Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形 ,原点一定严格在凸多边形内部.有m个人也到了这个二维平面.现在你得到了m个 ...

  2. 【BZOJ5008】方师傅的房子 三角剖分

    [BZOJ5008]方师傅的房子 Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形,原点一定严格在凸多边形内部.有m个人也到 ...

  3. 【刷题】BZOJ 5008 方师傅的房子

    Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形 ,原点一定严格在凸多边形内部.有m个人也到了这个二维平面.现在你得到了m个 ...

  4. 2014 UESTC暑前集训数据结构专题解题报告

    A.Islands 这种联通块的问题一看就知道是并查集的思想. 做法:从高水位到低水位依序进行操作,这样每次都有新的块浮出水面,可以在前面的基础上进行合并集合的操作.给每个位置分配一个数字,方便合并集 ...

  5. 2014 UESTC暑前集训动态规划专题解题报告

    A.爱管闲事 http://www.cnblogs.com/whatbeg/p/3762733.html B.轻音乐同好会 C.温泉旅馆 http://www.cnblogs.com/whatbeg/ ...

  6. Contest20140705 testB DP

    testB 输入文件: testB.in 输出文件testB.out 时限2000ms 问题描述: 方师傅有两个由数字组成的串 a1,a2,⋯,an 和 b1,b2,⋯,bm.有一天,方师傅感到十分无 ...

  7. UESTC_神秘绑架案 CDOJ 881

    神秘绑架案 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  8. Markdown 编写技巧汇总(一)

    编写文档,有很多格式选择,也有不同平台选择.下面就自己接触到的MarkDown编写文档的各种技巧做简单梳理,供自己参阅,也希望帮到网友. [1]添加空格 ①   这种写法比较老土,但是,很实用!注意都 ...

  9. 计算几何-凸包-toleft test

    toLeftTest toLeftTest是判断一个点是否在有向直线左侧的算法. 当点s位于向量pq左侧时,toLeftTest返回true.当点s位于向量pq右侧时,toLeftTest返回fals ...

随机推荐

  1. 初试Docker on Debian on VirtualBox

    一直以来都对Docker如雷贯耳,很想尝试一下但都被各种忙给耽误了,最近由于项目调试,需要安装 Oracle 和 SQL Server 数据库,但又不想安装到本机系统里,于是下决心啃一下docker这 ...

  2. andriod 学习三 使用android资源

    3.1 android框架中有许多资源,包括布局,字符串,位图,图片....,使用资源之前需要在相应的资源文件中定义资源,然后编译程序时ADT将定义的资源转换成java类并给予唯一的id,而代码中需要 ...

  3. (C#)代理模式

    1.代理模式 为其他对象提供代理以控制对这个对象的访问. 远程代理:为一个对象在不同的地址空间提供举报代表.这样可以隐藏一个对象在不同地址空间的事实. 虚拟代理:是依据需要创建开销很大的对象.通过它来 ...

  4. Linux中常用Shell命令

    本随笔文章,由个人博客(鸟不拉屎)转移至博客园 写于:2018 年 05 月 04 日 原地址:https://niaobulashi.com/archives/linux-shell.html -- ...

  5. JAVA基础学习之路(七)对象数组的定义及使用

    两种定义方式: 1.动态初始化: 定义并开辟数组:类名称 对象数组名[] = new 类名称[长度] 分布按成:类名称 对象数组名[] = null: 对象数组名 = new 类名称[长度]:   2 ...

  6. stm32之SPI通信协议

    SPI (Serial Peripheral interface),顾名思义就是串行外围设备接口.SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为P ...

  7. 如何借助windows的VHD引导特性实现VHD多windows系统共存

    近期,由于一些需要,需要运行3个windows系统,具体需要如何此处略去,现将实现方式共享如下. 测试环境: HP 820 G2, 4G内存, 500G SSD硬盘 windows 7 企业版 win ...

  8. Jquery复选框

    Jquery复选框 1.checkbox list选择 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  9. 5.azkaban权限管理

    权限简介 user 登录azkaban的用户 注意,如果不给用户roles groups,则用户就是普通用户,只能创建\查看\执行\调度自己的任务,不能看别人的 group group:用户的集合,给 ...

  10. nodejs笔记--模块篇(三)

    文件模块访问方式通过require('/文件名.后缀')    require('./文件名.后缀')    requrie('../文件名.后缀') 去访问,文件后缀可以省略:以"/&qu ...