Cupid's Arrow

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2301    Accepted Submission(s): 837

Problem Description

传说世上有一支丘比特的箭,凡是被这支箭射到的人,就会深深的爱上射箭的人。
世上无数人都曾经梦想得到这支箭。Lele当然也不例外。不过他想,在得到这支箭前,他总得先学会射箭。
日子一天天地过,Lele的箭术也越来越强,渐渐得,他不再满足于去射那圆形的靶子,他开始设计各种各样多边形的靶子。
不过,这样又出现了新的问题,由于长时间地练习射箭,Lele的视力已经高度近视,他现在甚至无法判断他的箭射到了靶子没有。所以他现在只能求助于聪明的Acmers,你能帮帮他嘛?

Input

本题目包含多组测试,请处理到文件结束。
在每组测试的第一行,包含一个正整数N(2<N<100),表示靶子的顶点数。
接着N行按顺时针方向给出这N个顶点的x和y坐标(0<x,y<1000)。
然后有一个正整数M,表示Lele射的箭的数目。
接下来M行分别给出Lele射的这些箭的X,Y坐标(0<X,Y<1000)。

Output

对于每枝箭,如果Lele射中了靶子,就在一行里面输出"Yes",否则输出"No"。

Sample Input

4
10 10
20 10
20 5
10 5
2
15 8
25 8

Sample Output

Yes
No
 
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <algorithm>
  6. //#include <algorithm>
  7. namespace Geometry {
  8. #define eps (1e-8)
  9. class point {
  10. public:
  11. double x, y;
  12. point() {}
  13. point(const point &p): x(p.x), y(p.y) {}
  14. point(double a, double b): x(a), y(b) {}
  15. point operator + (const point & p)const {
  16. point ret;
  17. ret.x = x + p.x, ret.y = y + p.y;
  18. return ret;
  19. }
  20. point operator - (const point & p)const {
  21. point ret;
  22. ret.x = x - p.x, ret.y = y - p.y;
  23. return ret;
  24. }
  25. //dot product
  26. double operator * (const point & p)const {
  27. return x * p.x + y * p.y;
  28. }
  29. //cross product
  30. double operator ^ (const point & p)const {
  31. return x * p.y - p.x * y;
  32. }
  33. bool operator < (const point & p)const {
  34. if (fabs(x - p.x) < eps) {
  35. return y < p.y;
  36. }
  37. return x < p.x;
  38. }
  39. double mold() {
  40. return sqrt(x * x + y * y);
  41. }
  42. };
  43. double cp(point a, point b, point o) {
  44. return (a - o) ^ (b - o);
  45. }
  46. double dp(point a, point b, point o) {
  47. return (a - o) * (b - o);
  48. }
  49. class line {
  50. public:
  51. point A, B;
  52. line() {}
  53. line(point a, point b): A(a), B(b) {}
  54. bool IsLineCrossed(const line &l)const {
  55. point v1, v2;
  56. double c1, c2;
  57. v1 = B - A, v2 = l.A - A;
  58. c1 = v1 ^ v2;
  59. v2 = l.B - A;
  60. c2 = v1 ^ v2;
  61. if (c1 * c2 >= ) {
  62. return false;
  63. }
  64. v1 = l.B - l.A, v2 = A - l.A;
  65. c1 = v1 ^ v2;
  66. v2 = B - l.A;
  67. c2 = v1 ^ v2;
  68. if (c1 * c2 >= ) {
  69. return false;
  70. }
  71. return true;
  72. }
  73. };
  74. /*
  75. ** get the convex closure of dot set,store in array s.
  76. ** return the amount of the dot in the convex closure
  77. */
  78. int Graham(point * p, point * s, int n) {
  79. std::sort(p, p + n);
  80. int top, m;
  81. s[] = p[];
  82. s[] = p[];
  83. top = ;
  84. for (int i = ; i < n; i++) {
  85. while (top > && cp(p[i], s[top], s[top - ]) >= ) {
  86. top--;
  87. }
  88. s[++top] = p[i];
  89. }
  90. m = top;
  91. s[++top] = p[n - ];
  92. for (int i = n - ; i >= ; i--) {
  93. while (top > m && cp(p[i], s[top], s[top - ]) >= ) {
  94. top--;
  95. }
  96. s[++top] = p[i];
  97. }
  98. return top;
  99. }
  100. int dcmp(double x) {
  101. if (x < -eps) {
  102. return -;
  103. } else {
  104. return (x > eps);
  105. }
  106. }
  107. //if the point p0 on the segment consists of point p1 and p2
  108. int PointOnSegment(point p0, point p1, point p2) {
  109. return dcmp(cp(p1, p2, p0)) == && dcmp(dp(p1, p2, p0)) <= ;
  110. }
  111. /*
  112. ** if the point pt in polygon consists of the dots in array p
  113. ** 0:outside
  114. ** 1:inside
  115. ** 2:on the border
  116. */
  117. int PointInPolygon(point pt, point * p, int n) {
  118. int i, k, d1, d2, wn = ;
  119. p[n] = p[];
  120. for (i = ; i < n; i++) {
  121. if (PointOnSegment(pt, p[i], p[i + ])) {
  122. return ;
  123. }
  124. k = dcmp(cp(p[i + ], pt, p[i]));
  125. d1 = dcmp(p[i + ].y - pt.y);
  126. d2 = dcmp(p[i + ].y - pt.y);
  127. if (k > && d1 <= && d2 > ) {
  128. wn++;
  129. }
  130. if (k < && d2 <= && d1 > ) {
  131. wn--;
  132. }
  133. }
  134. return wn != ? : ;
  135. }
  136. }
  137. //using namespace Geometry;
  138. using namespace Geometry;
  139. point p[];
  140. int main() {
  141. #ifndef ONLINE_JUDGE
  142. freopen("input.txt", "r", stdin);
  143. #endif
  144. int n, m;
  145. while (scanf("%d", &n) != EOF) {
  146. for (int i = ; i < n; i++) {
  147. scanf("%lf%lf", &p[i].x, &p[i].y);
  148. }
  149. scanf("%d", &m);
  150. point pt;
  151. for (int i = ; i < m; i++) {
  152. scanf("%lf%lf", &pt.x, &pt.y);
  153. if (PointInPolygon(pt, p, n) == ) {
  154. printf("Yes\n");
  155. } else {
  156. printf("No\n");
  157. }
  158. }
  159. }
  160. return ;
  161. }

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

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

    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 计算几何 判断一个点是否在多边形内

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

  4. [HDU1756]Cupid's Arrow

    题目大意: 给你一个简单多边形和若干个点,问每个点在多边形内还是外. 思路: 一开始没看清楚题,写了一个叉积法,事实上叉积法只能用来处理凸多边形与点的关系. 考虑一个射线法. 从这个点水平往左作一条射 ...

  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. layui 下拉框取值

    layui.use('form', function () { var form = layui.form; form.on('select(Status)', function (data) { c ...

  2. C# for 遍历 IPagedList

    IPagedList<Doc> ss = Doclist.ToPagedList(page, pageSize); ;i<ss.Count;i++) { var yy = ss[i] ...

  3. js-构造数组

    js中,字符串的特性跟数组非常类似.数组是一种很重要的数据结构.在java中,数组声明的时候就要为其指定类型,数组中只能放同一种类型的数据.Js中的数组可以放不同的类型,但是是有序的,类似于java中 ...

  4. vue中引入json数据,不用本地请求

    1.我的项目结构,需要在Daily.vue中引入daily.js中的json数据 2.把json数据放入一个js文件中,用exports导出,vscode的json格式太严格了,很多数据,调了一个多小 ...

  5. scrapy-redis使redis不止保存url

    先看scrapy-redis源码 class RedisMixin(object): """Mixin class to implement reading urls f ...

  6. 【剑指Offer】56、删除链表中重复的结点

      题目描述:   在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4-> ...

  7. 51nod1256 乘法逆元【扩展欧几里得】

    给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Input 输入2个数M, N中间用 ...

  8. springcloud 中文文档

    spring cloud 中文文档:https://springcloud.cc/spring-cloud-dalston.html spring cloud 中文网:https://springcl ...

  9. 0808关于RDS如何恢复到本地教程

    转自http://www.cnblogs.com/ilanni/archive/2016/02/25/5218129.html 公司目前使用的数据库是阿里云的RDS,目前RDS的版本为mysql5.6 ...

  10. 实践一些js中的prototype, __proto__, constructor

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...