CSES - E4590 2016 1 - Results
Submission details
Task:Taxing
Sender:eax511
Submission time:2016-09-17 14:45:05 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.05 sdetails
#2ACCEPTED0.05 sdetails
#3ACCEPTED0.06 sdetails
#4ACCEPTED0.06 sdetails
#5ACCEPTED0.06 sdetails

Compiler report

input/code.cpp: In function 'bool PointInPolygon(const std::vector<PT>&, PT)':
input/code.cpp:24:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<p.size();i++){
                        ^
input/code.cpp:26:26: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
     if((p[i].y <=    q.y &&
                          ^
input/code.cpp: In function 'bool PointOnPolygon(const std::vector<PT>&, PT)':
input/code.cpp:49:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<p.size();i++)
                        ^

Code

#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
double EPS = 1e-12;
typedef double PTT;
struct PT{
  PTT x,y;
};

PT operator-(const PT& a, const PT& b){
  return {a.x-b.x,a.y-b.y};
}
PT operator+(const PT& a, const PT& b){
  return {a.x+b.x,a.y+b.y};
}

PT operator*(const PT& a, PTT b){
  return {a.x*b,a.y*b};
}

bool PointInPolygon(const vector<PT> &p, PT q){
  bool c=0;
  for(int i=0;i<p.size();i++){
    int j = (i+1)%p.size();
    if((p[i].y <=    q.y &&
           q.y <  p[j].y ||
        p[j].y <=    q.y &&
           q.y <  p[i].y)&&
       q.x < p[i].x +(p[j].x-p[i].x) * (q.y-p[i].y) / (p[j].y-p[i].y)) c= !c;
  }
  return c;
}

PTT dot(PT a, PT b){return a.x*b.x+a.y*b.y;}

PTT dist2(PT a, PT b){return dot(a-b,a-b);}

PT ProjectPointSegment(PT a, PT b, PT c){
  double r = dot(b-a,b-a);
  if(fabs(r)<EPS)return a;
  r = dot(c-a, b-a)/r;
  if(r<0) return a;
  if(r>1) return b;
  return a + (b-a)*r;
}

bool PointOnPolygon(const vector<PT> &p, PT q){
  for(int i=0;i<p.size();i++)
    if(dist2(ProjectPointSegment(p[i], p[(i+1)%p.size()], q), q) < EPS)return true;
  return false;
}

int main(){
 vector<PT> a;
 int n;
 cin>>n;
 a.resize(n);
 for(auto& it : a)cin>>it.x>>it.y;
 cin>>n;
 for(int i=0; i<n; ++i){
  PT v;
  cin>>v.x>>v.y;
  if(PointOnPolygon(a,v))cout<<"border\n";
  else if(PointInPolygon(a,v))cout<<"inside\n";
  else cout<<"outside\n";
 }
 return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
9
0 10
-2 0
-1 -4
-7 1
...

correct output
inside
inside
inside
outside
inside
...

user output
inside
inside
inside
outside
inside
...

Test 2

Verdict: ACCEPTED

input
99
13 4
14 8
10 5
9 6
...

correct output
inside
border
inside
outside
inside
...

user output
inside
border
inside
outside
inside
...

Test 3

Verdict: ACCEPTED

input
99
50 33
28 57
80 28
37 60
...

correct output
outside
inside
outside
inside
outside
...

user output
outside
inside
outside
inside
outside
...

Test 4

Verdict: ACCEPTED

input
999
87 -3
91 5
77 -7
41 -18
...

correct output
inside
outside
inside
outside
outside
...

user output
inside
outside
inside
outside
outside
...

Test 5

Verdict: ACCEPTED

input
999
915887 494689
950720 189774
823677 443456
879821 402443
...

correct output
outside
outside
inside
inside
inside
...

user output
outside
outside
inside
inside
inside
...