zoukankan      html  css  js  c++  java
  • 【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.
    ", (int)clock());
    119     #endif
    120     
    121     return 0;
    122 }
  • 相关阅读:
    Time Zone 【模拟时区转换】(HDU暑假2018多校第一场)
    HDU 1281 棋盘游戏 【二分图最大匹配】
    Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】
    Codeforces Round #527 (Div. 3) D2. Great Vova Wall (Version 2) 【思维】
    Codeforces Round #527 (Div. 3) D1. Great Vova Wall (Version 1) 【思维】
    Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) C. Connect Three 【模拟】
    Avito Cool Challenge 2018 E. Missing Numbers 【枚举】
    Avito Cool Challenge 2018 C. Colorful Bricks 【排列组合】
    005 如何分析问题框架
    004 如何定义和澄清问题
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4927407.html
Copyright © 2011-2022 走看看