제출 #448633

#제출 시각아이디문제언어결과실행 시간메모리
448633vanicThe Forest of Fangorn (CEOI14_fangorn)C++14
10 / 100
384 ms65540 KiB
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> using namespace std; #define double long double const int maxn=2005, maxm=1e4+5; pair < int, int > d[maxn]; pair < int, int > q[maxm]; vector < double > kor[maxn][4]; // jednadzbe: x=0, y=0, x=w, y=h vector < pair < double, int > > sw[4]; vector < int > sol; pair < int, int > pos; int w, h; void radi(int x, int y){ double a, b, c; int dx, dy; dx=d[x].first-d[y].first; dy=d[x].second-d[y].second; a=-dy; b=dx; c=-a*d[x].first-b*d[x].second; double sol1, sol2, sol3, sol4; if(b==0){ sol1=-1e30; sol3=1e30; } else{ sol1=-c/b; sol3=(-c-a*w)/b; } if(a==0){ sol2=-1e30; sol4=1e30; } else{ sol2=-c/a; sol4=(-c-b*h)/a; } // cout << sol1 << ' ' << sol2 << ' ' << sol3 << ' ' << sol4 << endl; if(b==0){ if(d[x].second<d[y].second){ kor[x][0].push_back(sol1); kor[y][2].push_back(sol3); kor[x][2].push_back(sol1); kor[y][0].push_back(sol3); } else{ kor[x][0].push_back(sol3); kor[y][2].push_back(sol1); kor[x][2].push_back(sol3); kor[y][0].push_back(sol1); } } else if(d[x].first<d[y].first){ kor[x][0].push_back(sol1); kor[y][2].push_back(sol3); } else{ kor[x][2].push_back(sol3); kor[y][0].push_back(sol1); } if(a==0){ if(d[x].first<d[y].first){ kor[x][1].push_back(sol2); kor[y][3].push_back(sol4); kor[x][3].push_back(sol2); kor[y][1].push_back(sol4); } else{ kor[x][1].push_back(sol4); kor[y][3].push_back(sol2); kor[x][3].push_back(sol4); kor[y][1].push_back(sol2); } } else if(d[x].second<d[y].second){ kor[x][1].push_back(sol2); kor[y][3].push_back(sol4); } else{ kor[x][3].push_back(sol4); kor[y][1].push_back(sol2); } } double ccw(pair < double, double > a, pair < double, double > b, pair < double, double > c){ return a.first*(b.second-c.second)+b.first*(c.second-a.second)+c.first*(a.second-b.second); } bool provjeri(pair < double, double > a, pair < double, double > b, pair < double, double > c, pair < double, double > x){ if(ccw(a, b, c)<0){ swap(b, c); } return ccw(a, b, x)>0 && ccw(b, c, x)>0 && ccw(c, a, x)>0; } void rijesi(int x, int y){ sort(kor[x][y].begin(), kor[x][y].end()); pair < double, double > t1, t2; if(y==0){ t1.first=0; t2.first=0; } else if(y==1){ t1.second=0; t2.second=0; } else if(y==2){ t1.first=w; t2.first=w; } else{ t1.second=h; t2.second=h; } int ind=-1; for(int i=0; i<(int)kor[x][y].size()-1; i++){ if(y==0){ t1.second=kor[x][y][i]; t2.second=kor[x][y][i+1]; } else if(y==1){ t1.first=kor[x][y][i]; t2.first=kor[x][y][i+1]; } else if(y==2){ t1.second=kor[x][y][i]; t2.second=kor[x][y][i+1]; } else{ t1.first=kor[x][y][i]; t2.first=kor[x][y][i+1]; } if(provjeri(t1, t2, d[x], pos)){ ind=i; break; } } if(!kor[x][y].empty()){ sw[y].push_back({kor[x][y][0], 1}); sw[y].push_back({kor[x][y].back(), -1}); if(ind!=-1){ sw[y].push_back({kor[x][y][ind], -1}); sw[y].push_back({kor[x][y][ind+1], 1}); } } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> w >> h; cin >> pos.first >> pos.second; int n,m; cin >> m; for(int i=0; i<m; i++){ cin >> q[i].first >> q[i].second; } cin >> n; for(int i=0; i<n; i++){ cin >> d[i].first >> d[i].second; } for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ radi(i, j); } } for(int i=0; i<n; i++){ for(int j=0; j<4; j++){ rijesi(i, j); } } for(int i=0; i<m; i++){ if(q[i].first==0){ sw[0].push_back({q[i].second, i+2}); } else if(q[i].second==0){ sw[1].push_back({q[i].first, i+2}); } else if(q[i].first==w){ sw[2].push_back({q[i].second, i+2}); } else{ sw[3].push_back({q[i].first, i+2}); } } int val; for(int i=0; i<4; i++){ sort(sw[i].begin(), sw[i].end()); val=0; for(int j=0; j<(int)sw[i].size(); j++){ if(sw[i][j].second<2){ val+=sw[i][j].second; } else{ if(val){ continue; } sol.push_back(sw[i][j].second-1); } } } cout << sol.size() << '\n'; sort(sol.begin(), sol.end()); for(int i=0; i<(int)sol.size(); i++){ cout << sol[i] << ' '; } cout << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...