【HDOJ】1756 Cupid's Arrow
图论,点在多边形内部的判定。
1 /* 1756 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <deque> 10 #include <algorithm> 11 #include <cstdio> 12 #include <cmath> 13 #include <ctime> 14 #include <cstring> 15 #include <climits> 16 #include <cctype> 17 #include <cassert> 18 #include <functional> 19 #include <iterator> 20 #include <iomanip> 21 using namespace std; 22 //#pragma comment(linker,"/STACK:102400000,1024000") 23 24 #define sti set<int> 25 #define stpii set<pair<int, int> > 26 #define mpii map<int,int> 27 #define vi vector<int> 28 #define pii pair<int,int> 29 #define vpii vector<pair<int,int> > 30 #define rep(i, a, n) for (int i=a;i<n;++i) 31 #define per(i, a, n) for (int i=n-1;i>=a;--i) 32 #define clr clear 33 #define pb push_back 34 #define mp make_pair 35 #define fir first 36 #define sec second 37 #define all(x) (x).begin(),(x).end() 38 #define SZ(x) ((int)(x).size()) 39 #define lson l, mid, rt<<1 40 #define rson mid+1, r, rt<<1|1 41 42 const double eps = 1e-10; 43 const int maxn = 105; 44 45 int dcmp(double x) { 46 if (fabs(x) < eps) return 0; 47 return x<0 ? -1:1; 48 } 49 50 typedef struct Point { 51 double x, y; 52 53 Point() {} 54 55 Point(double x_, double y_): 56 x(x_), y(y_) {} 57 } Point; 58 59 Point poly[maxn]; 60 int n; 61 62 Point operator-(Point A, Point B) { 63 return Point(A.x-B.x, A.y-B.y); 64 } 65 66 double Dot(Point A, Point B) { 67 return A.x*B.x + A.y*B.y; 68 } 69 70 double Cross(Point A, Point B) { 71 return A.x*B.y - A.y*B.x; 72 } 73 74 bool OnSegment(Point P, Point A, Point B) { 75 return dcmp(Cross(A-P, B-P))==0 && dcmp(Dot(A-P, B-P))<=0; 76 } 77 78 bool isPointInPolygon(Point p, Point *poly) { 79 int wn = 0; 80 81 rep(i, 0, n) { 82 if (OnSegment(p, poly[i], poly[(i+1)%n])) 83 return true; 84 int k = dcmp(Cross(poly[(i+1)%n]-poly[i], p-poly[i])); 85 int d1 = dcmp(poly[i].y - p.y); 86 int d2 = dcmp(poly[(i+1)%n].y - p.y); 87 88 if (k>0 && d1<=0 && d2>0) ++wn; 89 if (k<0 && d2<=0 && d1>0) --wn; 90 } 91 92 return wn!=0; 93 } 94 95 int main() { 96 ios::sync_with_stdio(false); 97 #ifndef ONLINE_JUDGE 98 freopen("data.in", "r", stdin); 99 freopen("data.out", "w", stdout); 100 #endif 101 102 int m; 103 bool flag; 104 Point p; 105 106 while (scanf("%d",&n) != EOF) { 107 rep(i, 0, n) 108 scanf("%lf %lf", &poly[i].x, &poly[i].y); 109 scanf("%d", &m); 110 while (m--) { 111 scanf("%lf %lf", &p.x, &p.y); 112 flag = isPointInPolygon(p, poly); 113 puts(flag ? "Yes":"No"); 114 } 115 } 116 117 #ifndef ONLINE_JUDGE 118 printf("time = %d.\n", (int)clock()); 119 #endif 120 121 return 0; 122 }