Submission #932711

#TimeUsernameProblemLanguageResultExecution timeMemory
932711abcdehelloPark (BOI16_park)C++17
100 / 100
321 ms58140 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; typedef pair<double,pll> pdll; #define f first #define s second struct tree{ ll x,y,r; }; double dist(tree a,tree b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double separation(tree a,tree b){ return dist(a,b)-1.00*a.r-1.00*b.r; } ll n,m,w,h,p[2050],con[5][5]; tree t[2050]; vector<pair<pll,ll>> qry; vector<pdll> sep; vector<int> ans[100050]; int find(int u){ if (p[u]!=u) p[u]=find(p[u]); return p[u]; } bool isConnected(int u,int v){ return find(u)==find(v); } void uni(int u,int v){ p[find(u)]=find(v); } int main(){ cin >> n >> m; cin >> w >> h; for (int i=1;i<=n+10;i++) p[i]=i; for (int i=1;i<=n;i++) cin >> t[i].x >> t[i].y >> t[i].r; for (int i=1;i<=m;i++){ ll e,r; cin >> r >> e; qry.push_back({{r*2,e},i}); } for (int i=1;i<=n;i++){ for (int j=i+1;j<=n;j++){ sep.push_back({separation(t[i],t[j]),{i,j}}); } } for (int i=1;i<=n;i++){ sep.push_back({t[i].x-t[i].r,{i,n+1}});//left border sep.push_back({t[i].y-t[i].r,{i,n+2}});//down border sep.push_back({w-t[i].x-t[i].r,{i,n+3}});//right border sep.push_back({h-t[i].y-t[i].r,{i,n+4}});//up border } sort(sep.begin(),sep.end()); reverse(sep.begin(),sep.end()); sort(qry.begin(),qry.end()); for (auto q:qry){ ll d=q.f.f,e=q.f.s,ind=q.s; while (sep.size()&&sep.back().f<d) uni(sep.back().s.f,sep.back().s.s),sep.pop_back(); for (int i=1;i<=4;i++) for (int j=1;j<=4;j++) con[i][j]=1; for (int i=1;i<=4;i++){ if (isConnected(n+i,n+(i%4)+1)){ for (int j=1;j<=4;j++){ if (i!=j) con[i][j]=con[j][i]=0; } } } if (isConnected(n+1,n+3)){ for (int i=1;i<=2;i++){ for (int j=3;j<=4;j++) con[i][j]=con[j][i]=0; } } if (isConnected(n+2,n+4)){ con[1][2]=con[1][3]=con[2][1]=con[3][1]=0; con[4][2]=con[4][3]=con[2][4]=con[3][4]=0; } for (int i=1;i<=4;i++) if (con[e][i]) ans[ind].push_back(i); } for (int i=1;i<=m;i++) sort(ans[i].begin(),ans[i].end()); for (int i=1;i<=m;i++){ for (int j:ans[i]) cout << j; cout << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...