제출 #1293755

#제출 시각아이디문제언어결과실행 시간메모리
1293755trantrungkeinPark (BOI16_park)C++20
100 / 100
356 ms132016 KiB
#include<bits/stdc++.h> #define int long long using namespace std; const int N = 2e5 + 1; int n,m,w,h,x[N],y[N],r[N]; struct node{ int u,v,w,t; bool operator < (const node &other) const{ if(w != other.w) return w < other.w; return t < other.t; } }; vector<node> edges; vector<int> ans[N]; int sq(int x) {return x*x;} int dist(int x, int y, int u, int v){ return sqrt(sq(u-x) + sq(v-y)); } void add(int x, int y,int dmm, int u, int v, int l, int r){ int value = dist(x,y,u,v) - dmm; edges.push_back({l,r,value,1}); } int par[N],siz[N]; int Find(int u){ return (u == par[u]) ? u : par[u] = Find(par[u]); } void Union(int u, int v){ u = Find(u); v = Find(v); if(u == v) return; if(siz[u] < siz[v]) swap(u,v); siz[u] += siz[v]; par[v] = u; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin >> n >> m; for(int i = 1; i <= 2*n; i++) par[i] = i, siz[i] = 1; cin >> w >> h; for(int i = 1; i <= n; i++){ cin >> x[i] >> y[i] >> r[i]; add(x[i],y[i],r[i],0,y[i],n+1,i); add(x[i],y[i],r[i],x[i],h,n+2,i); add(x[i],y[i],r[i],w,y[i],n+3,i); add(x[i],y[i],r[i],x[i],0,n+4,i); } for(int i = 1; i <= n; i++){ for(int j = i + 1; j <= n; j++){ int len = dist(x[i],y[i],x[j],y[j]) - r[i] - r[j]; edges.push_back({i,j,len,1}); } } for(int i = 1; i <= m; i++){ int r,e; cin >> r >> e; edges.push_back({i,e,2*r,0}); } sort(edges.begin(),edges.end()); for(auto [u,v,w,id] :edges){ if(id == 1){ Union(u,v); continue; } if(v == 1){ ans[u].push_back(v); if(Find(n+1) == Find(n+4)) continue; if(Find(n+1) != Find(n+3)){ if(Find(n+2) != Find(n+1)) ans[u].push_back(4); if(Find(n+2) != Find(n+4)){ if(Find(n+2) != Find(n+3)) ans[u].push_back(3); } } if(Find(n+2) != Find(n+4)) { if(Find(n+3) != Find(n+4)) ans[u].push_back(2); } } if(v == 2){ ans[u].push_back(v); if(Find(n+3) == Find(n+4)) continue; if(Find(n+1) != Find(n+3)){ if(Find(n+2) != Find(n+3))ans[u].push_back(3); if(Find(n+2) != Find(n+4)){ if(Find(n+2) != Find(n+1)) ans[u].push_back(4); } } if(Find(n+2) != Find(n+4)) { if(Find(n+1) != Find(n+4)) ans[u].push_back(1); } } if(v == 3){ ans[u].push_back(v); if(Find(n+2) == Find(n+3)) continue; if(Find(n+1) != Find(n+3)){ if(Find(n+4) != Find(n+3))ans[u].push_back(2); if(Find(n+2) != Find(n+4)){ if(Find(n+1) != Find(n+4)) ans[u].push_back(1); } } if(Find(n+2) != Find(n+4)) { if(Find(n+1) != Find(n+2)) ans[u].push_back(4); } } if(v == 4){ ans[u].push_back(v); if(Find(n+1) == Find(n+2)) continue; if(Find(n+1) != Find(n+3)){ if(Find(n+4) != Find(n+1))ans[u].push_back(1); if(Find(n+2) != Find(n+4)){ if(Find(n+4) != Find(n+3)) ans[u].push_back(2); } } if(Find(n+2) != Find(n+4)) { if(Find(n+3) != Find(n+2)) ans[u].push_back(3); } } } for(int i = 1; i <= m; i++){ sort(ans[i].begin(),ans[i].end()); for(int id : ans[i]) cout << id; cout <<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...