Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// https://cses.fi/problemset/task/2192/
- #include <iostream>
- using namespace std;
- const long long INF = 3e9;
- struct P{
- long long x, y;
- void read(){cin>>x>>y;};
- P operator - (P b)
- {
- return {x-b.x,y-b.y};
- }
- void operator -= (P b)
- {
- x -= b.x;
- y -= b.y;
- }
- long long operator * (P b)
- {
- return (1LL*x*b.y) - (1LL*y*b.x) ;
- }
- long long triangle (P b , P c)
- {
- return (b - *this) * (c - *this);
- }
- }v[1001];
- bool intersectSegment(P p1, P p2, P p3, P p4)
- {
- /// If parrallel
- if((p2-p1) * (p4-p3) == 0)
- {
- if(p1.triangle(p2,p3) != 0)
- return false;
- for(int i = 1;i<=2;i++)
- {
- if((max(p1.x,p2.x) < min(p3.x,p4.x)) || (max(p1.y,p2.y) < min(p3.y,p4.y)))
- return false;
- swap(p1,p3); swap(p2,p4);
- }
- return true;
- }
- ///Not parrallel
- for(int i = 1;i<=2;i++)
- {
- long long sign1 = p1.triangle(p2,p3);
- long long sign2 = p1.triangle(p2,p4);
- if((sign1<0&&sign2<0) || (sign1>0&&sign2>0))
- return false;
- swap(p1,p3); swap(p2,p4);
- }
- return true;
- }
- bool segment_contains(P a, P b, P c)
- {
- if(a.triangle(b,c) != 0) return false;
- return (min(a.x,b.x) <= c.x && c.x <= max(a.x,b.x)) &&
- (min(a.y,b.y) <= c.y && c.y <= max(a.y,b.y)) ;
- }
- int main()
- {
- int n , m ;
- cin>>n>>m;
- for(int i = 0;i<n;i++)
- v[i].read();
- for(int rep = 1;rep<=m;rep++)
- {
- P p1; p1.read();
- int cnt = 0 ;
- bool boundary = false;
- P out = P{p1.x + 1 , INF};
- for(int i = 0; i<n; i++)
- {
- int j = (i+1)%n;
- if(segment_contains(v[i], v[j] , p1)) boundary = true;
- if(intersectSegment(p1, out , v[i], v[j]))
- cnt++;
- }
- if(boundary) cout<<"BOUNDARY\n";
- else if(cnt%2==0)
- cout<<"OUTSIDE\n";
- else cout<<"INSIDE\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement