Advertisement
Hezov

Puncte in poligon

Sep 29th, 2024
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. /// https://cses.fi/problemset/task/2192/
  2. #include <iostream>
  3. using namespace std;
  4. const long long INF = 3e9;
  5. struct P{
  6.     long long x, y;
  7.     void read(){cin>>x>>y;};
  8.     P operator - (P b)
  9.     {
  10.         return {x-b.x,y-b.y};
  11.     }
  12.     void operator -= (P b)
  13.     {
  14.         x -= b.x;
  15.         y -= b.y;
  16.     }
  17.     long long operator * (P b)
  18.     {
  19.         return (1LL*x*b.y) - (1LL*y*b.x) ;
  20.     }
  21.     long long triangle (P b , P c)
  22.     {
  23.         return (b - *this) * (c - *this);
  24.     }
  25. }v[1001];
  26. bool intersectSegment(P p1, P p2, P p3, P p4)
  27. {
  28.     /// If parrallel
  29.     if((p2-p1) * (p4-p3) == 0)
  30.     {
  31.         if(p1.triangle(p2,p3) != 0)
  32.             return false;
  33.         for(int i = 1;i<=2;i++)
  34.         {
  35.             if((max(p1.x,p2.x) < min(p3.x,p4.x)) || (max(p1.y,p2.y) < min(p3.y,p4.y)))
  36.                 return false;
  37.             swap(p1,p3); swap(p2,p4);
  38.         }
  39.         return true;
  40.     }
  41.     ///Not parrallel
  42.     for(int i = 1;i<=2;i++)
  43.     {
  44.         long long sign1 = p1.triangle(p2,p3);
  45.         long long sign2 = p1.triangle(p2,p4);
  46.         if((sign1<0&&sign2<0) || (sign1>0&&sign2>0))
  47.             return false;
  48.         swap(p1,p3); swap(p2,p4);
  49.     }
  50.     return true;
  51. }
  52. bool segment_contains(P a, P b, P c)
  53. {
  54.     if(a.triangle(b,c) != 0) return false;
  55.     return (min(a.x,b.x) <= c.x && c.x <= max(a.x,b.x))  &&
  56.            (min(a.y,b.y) <= c.y && c.y <= max(a.y,b.y)) ;
  57. }
  58. int main()
  59. {
  60.     int n , m ;
  61.     cin>>n>>m;
  62.     for(int i = 0;i<n;i++)
  63.         v[i].read();
  64.     for(int rep = 1;rep<=m;rep++)
  65.     {
  66.         P p1; p1.read();
  67.         int cnt = 0 ;
  68.         bool boundary = false;
  69.         P out = P{p1.x + 1 , INF};
  70.         for(int i = 0; i<n; i++)
  71.         {
  72.             int j = (i+1)%n;
  73.             if(segment_contains(v[i], v[j] , p1)) boundary = true;
  74.             if(intersectSegment(p1, out , v[i], v[j]))
  75.                 cnt++;
  76.         }
  77.         if(boundary) cout<<"BOUNDARY\n";
  78.         else if(cnt%2==0)
  79.             cout<<"OUTSIDE\n";
  80.         else cout<<"INSIDE\n";
  81.     }
  82.     return 0;
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement