제출 #240017

#제출 시각아이디문제언어결과실행 시간메모리
240017alishahali1382원 고르기 (APIO18_circle_selection)C++14
100 / 100
1753 ms35440 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("O2,unroll-loops") //#pragma GCC optimize("no-stack-protector,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<pii, int> piii; typedef pair<ll, ll> pll; #define debug(x) cerr<<#x<<'='<<(x)<<endl; #define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl; #define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl; #define debugv(v) {cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;} #define all(x) x.begin(), x.end() #define pb push_back #define kill(x) return cout<<x<<'\n', 0; const ld eps=1e-7; const int inf=1000000010; const ll INF=10000000000000010LL; const int mod=1000000007; const int MAXN=300010, LOG=20; int n, m, k, u, v, x, y, t, a, b, sz; int X[MAXN], Y[MAXN], R[MAXN], P[MAXN], L; int ans[MAXN]; pii shit[MAXN]; vector<int> mp[MAXN]; bool check(int i, int j){ ll dx=X[i]-X[j], dy=Y[i]-Y[j], r=R[i]+R[j]; return dx*dx+dy*dy<=r*r; } int gt(pii p){ return lower_bound(shit, shit+sz, p)-shit; } void Build(){ for (int i=0; i<sz; i++) mp[i].clear(); sz=0; for (int i=1; i<=n; i++) if (!ans[i]) shit[sz++]={X[i]/L, Y[i]/L}; sort(shit, shit+sz); sz=unique(shit, shit+sz)-shit; for (int i=1; i<=n; i++) if (!ans[i]) mp[gt({X[i]/L, Y[i]/L})].pb(i); } int main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); cin>>n; for (int i=1; i<=n; i++) cin>>X[i]>>Y[i]>>R[i], P[i]=i; sort(P+1, P+n+1, [](int i, int j){ return pii(R[i], -i)>pii(R[j], -j); }); L=R[P[1]]; Build(); // for (int i=0; i<sz; i++) debugp(shit[i]) for (int i=1; i<=n; i++){ int id=P[i]; if (ans[id]) continue ; if (R[id]<.75*L) L=R[id], Build(); int x=X[id]/L, y=Y[id]/L; for (int xx=x-2; xx<=x+2; xx++) for (int yy=y-2; yy<=y+2; yy++){ int pos=gt({xx, yy}); if (pos==sz || shit[pos]!=pii(xx, yy)) continue ; vector<int> vec=mp[pos], v2; for (int j:vec){ if (check(id, j)) ans[j]=id; else v2.pb(j); } mp[pos]=v2; } } for (int i=1; i<=n; i++) cout<<ans[i]<<' '; return 0; } /* 11 9 9 2 13 2 1 11 8 2 3 3 2 3 12 1 12 14 1 9 8 5 2 8 2 5 2 1 14 4 2 14 14 1 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...