Submission #1319090

#TimeUsernameProblemLanguageResultExecution timeMemory
1319090keremPark (BOI16_park)C++20
100 / 100
294 ms56852 KiB
#include <bits/stdc++.h> using namespace std; #define int int64_t #define pb push_back #define emb emplace_back #define fr first #define sc second #define all(x) x.begin(),x.end() #define sp << " " << #define N 2000 #define inf 1e9 typedef pair<int,int> ii; typedef tuple<int,int,int> iii; int dsu[N+5]; int find(int x){ if(dsu[x]<0) return x; return dsu[x]=find(dsu[x]); } void comb(int x,int y){ x=find(x);y=find(y); if(x==y) return; dsu[y]=x; } void solve(){ memset(dsu,-1,sizeof(dsu)); int n,q,w,h; cin >> n >> q >> w >> h; vector<iii> circle,edge,query; for(int i=0;i<n;i++){ int x,y,z; cin >> x >> y >> z; circle.emb(x,y,z); } for(int i=0;i<q;i++){ int x,y; cin >> x >> y; query.emb(x,y-1,i); } for(int i=0;i<n;i++){ int x,y,r; tie(x,y,r)=circle[i]; edge.emb(x-r,i,n+0); edge.emb(y-r,i,n+1); edge.emb(w-x-r,i,n+2); edge.emb(h-y-r,i,n+3); for(int j=i+1;j<n;j++){ int x1,y1,r1; tie(x1,y1,r1)=circle[j]; edge.emb((int)sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y))-r-r1,i,j); } } sort(all(edge)); sort(all(query)); int j=0; vector<int> ans[q]; for(auto [r,st,i]:query){ while(get<0>(edge[j])<2*r){ comb(get<1>(edge[j]),get<2>(edge[j])); j++; } int a=st,b=(st+1)%4,c=(st+2)%4,d=(st+3)%4; ans[i].pb(a); if(find(n+a)!=find(n+b)){ if(find(n+b)!=find(n+d) && find(n+b)!=find(n+c)) ans[i].pb(b); if(find(n+b)!=find(n+d) && find(n+a)!=find(n+c) && find(n+c)!=find(n+d)) ans[i].pb(c); if(find(n+a)!=find(n+c) && find(n+a)!=find(n+d)) ans[i].pb(d); } } for(int i=0;i<q;i++){ sort(all(ans[i])); for(int j:ans[i]) cout << j+1; cout << "\n"; } } int32_t main(){ cout << fixed << setprecision(9); ios_base::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL); int test=1; //~ cin >> test; while(test--){ solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...