题目大意:
  给你一个简单多边形和若干个点,问每个点在多边形内还是外。

思路:
  一开始没看清楚题,写了一个叉积法,事实上叉积法只能用来处理凸多边形与点的关系。
  考虑一个射线法。
  从这个点水平往左作一条射线,如果与多边形相交次数为偶数,则在多边形外,否则在多边形内。
  考虑一些特殊情况:
    1.射线与多边形某条边重合,不算。
    2.射线经过某个顶点,只能够算一次。
  对于第一种情况,我们只需要判一下是否平行即可,对于第二种情况,我们对于多边形上的边区分一下上顶点和下顶点即可,上顶点算,下顶点不算。

 #include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
struct Point {
double x,y;
};
Point p[N];
int main() {
int n;
while(~scanf("%d",&n)) {
for(register int i=;i<n;i++) {
p[i]=(Point){getint(),getint()};
}
for(register int m=getint();m;m--) {
const Point q=(Point){getint(),getint()};
int cnt=;
if(p[].y==p[n-].y) {
} else if(p[].x==p[n-].x) {
if(p[].x<q.x&&std::min(p[].y,p[n-].y)<q.y&&q.y<=std::max(p[].y,p[n-].y)) {
cnt++;
}
} else if((q.y-p[n-].y)/((p[].y-p[n-].y)/(p[].x-p[n-].x))+p[n-].x<=q.x) {
if(std::min(p[].y,p[n-].y)<q.y&&q.y<=std::max(p[].y,p[n-].y)) {
cnt++;
}
}
for(register int i=;i<n;i++) {
if(p[i].y==p[i-].y) {
} else if(p[i].x==p[i-].x) {
if(p[i].x<q.x&&std::min(p[i].y,p[i-].y)<q.y&&q.y<=std::max(p[i].y,p[i-].y)) {
cnt++;
}
} else if((q.y-p[i-].y)/((p[i].y-p[i-].y)/(p[i].x-p[i-].x))+p[i-].x<=q.x) {
if(std::min(p[i].y,p[i-].y)<q.y&&q.y<=std::max(p[i].y,p[i-].y)) {
cnt++;
}
}
}
puts((cnt&)?"Yes":"No");
}
}
return ;
}

[HDU1756]Cupid's Arrow的更多相关文章

  1. Cupid's Arrow[HDU1756]

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  2. HDU 1756 Cupid's Arrow 判断点在多边形的内部

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  3. hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. HDU 1756 Cupid's Arrow 计算几何 判断一个点是否在多边形内

    LINK:Cupid's Arrow 前置函数 atan2 返回一个向量的幅角.范围为[Pi,-Pi) 值得注意的是 返回的是 相对于x轴正半轴的辐角. 而判断一个点是否在一个多边形内 通常有三种方法 ...

  5. HDU 1756 Cupid's Arrow( 判断点在多边形的内外 )

    链接:传送门 思路:判断每支箭是否在多边形内,计算几何点定位中水题,不清楚下面的代码能不能适用于给定点的顺序不确定( 既不是顺时针又不是逆时针 ) /************************* ...

  6. 【HDOJ】1756 Cupid's Arrow

    图论,点在多边形内部的判定. /* 1756 */ #include <iostream> #include <string> #include <map> #in ...

  7. HDU 1756 Cupid's Arrow (几何问题,判定点在多边形内部)

    题意:中文的么,自己看喽. 析:很容易明白是判定点是不是在多边形内部,一般是向量来判定,我一开始用点在向量的右侧,因为是顺时针给的,只要点全在外侧或边上, 就可以,暴力一下就ok.由于这个是浮点数,一 ...

  8. ACM第一阶段学习内容

    一.知识目录 字符串处理 ................................................................. 3 1.KMP 算法 .......... ...

  9. 下载恶意pcap包的网站

    说几个我经常用的,免费的:1.  Malware  Traffic  Analysis:  http://www.malware-traffic-analysis.net/2018/index.htm ...

随机推荐

  1. this可以通过call改变的测试

  2. Java多线程学习(一)Java多线程入门

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79640870 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  3. JS中,children和childNodes的不同之处

    <ul id="ul"><li></li><li></li><li><span></spa ...

  4. 基于 Arduino 开发板,这款插座是可编程且开源的

    基于 Arduino 开发板,这款插座是可编程且开源的 https://www.oschina.net/news/74861/open-source-socket https://github.com ...

  5. 排名函数row_number() over(order by)用法

    1. 定义 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY [列名]DESC) 是先把[列名]降序排列,再为降序以 ...

  6. HDU - 2818

    Building Block Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. 你想了解的轮询、长轮询和websocket都在这里了

    日常生活中,有很多需要数据的实时更新,比如群聊信息的实时更新,还有投票系统的实时刷新等 实现的方式有很多种,比如轮询.长轮询.websocket 轮询 轮询是通过设置页面的刷新频率(设置多长时间自动刷 ...

  8. python资源合集

    Python 官网: https://www.python.org/ Python2.7 doc: https://docs.python.org/2/ Python Package User Gui ...

  9. Go语言的指针的一些测试

    参考URL: http://ilovers.sinaapp.com/drupal/node/33 1). 指针在 c 中是个重要的东西,& 和 * 一个取地址.一个解析地址,这是 c 的用法, ...

  10. php打开错误日志

    ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);