Task: | Taxing |
Sender: | eax511 |
Submission time: | 2016-09-17 14:45:05 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.05 s | details |
#2 | ACCEPTED | 0.05 s | details |
#3 | ACCEPTED | 0.06 s | details |
#4 | ACCEPTED | 0.06 s | details |
#5 | ACCEPTED | 0.06 s | details |
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 ... |