Submission #258974

#TimeUsernameProblemLanguageResultExecution timeMemory
258974amoo_safarCircle selection (APIO18_circle_selection)C++17
100 / 100
777 ms28752 KiB
// Null #include <bits/stdc++.h> #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #define pb push_back #define F first #define S second #define all(x) x.begin(), x.end() #define debug(x) cerr << #x << " : " << x << '\n' using namespace std; typedef long long ll; typedef long double ld; typedef string str; typedef pair<ll, ll> pll; typedef pair<int, int> pii; const ll Mod = 1000000007LL; const int N = 3e5 + 10; const int Inf = 2e9; int n, x[N], y[N], r[N]; int mk[N]; vector<pii> V[N]; vector<int> U, X, Y; void Build(int L){ for(int i = 0; i < (int) U.size(); i++) V[i].clear(); U.clear(); for(int i : X){ if(mk[i]) continue; U.pb(x[i] / L); } //sort(all(U)); U.resize(unique(all(U)) - U.begin() ); for(int i : Y) if(!mk[i]) V[lower_bound(all(U), x[i] / L) - U.begin()].pb({y[i] / L, i}); for(int i = 0; i < (int) U.size(); i++) sort(all(V[i])); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for(int i = 1; i <= n; i++){ cin >> x[i] >> y[i] >> r[i]; X.pb(i); Y.pb(i); } vector<int> I(n); iota(all(I), 1); sort(all(I), [&](int i, int j){ return (r[i] == r[j] ? i < j : r[i] > r[j]); }); sort(all(X), [&](int i, int j){ return x[i] < x[j]; }); sort(all(Y), [&](int i, int j){ return y[i] < y[j]; }); int L = r[I[0]]; Build(L); for(auto id : I){ if(mk[id]) continue; if(L >= 4*r[id]) Build(L = r[id]); int i = x[id] / L; int j = y[id] / L; int nei; for(int pos = lower_bound(all(U), i - 2) - U.begin(); pos < (int) U.size() && U[pos] <= i + 2; pos ++){ for(int posj = lower_bound(all(V[pos]), pii(j - 2, -1)) - V[pos].begin(); posj < (int) V[pos].size() && V[pos][posj].F <= j + 2; posj ++){ nei = V[pos][posj].S; if(mk[nei]) continue; if(1ll*(x[id] - x[nei])*(x[id] - x[nei]) + 1ll*(y[id] - y[nei])*(y[id] - y[nei]) <= 1ll*(r[id] + r[nei])*(r[id] + r[nei]) ){ mk[nei] = id; } } } } for(int i = 1; i <= n; i++) cout << mk[i] << ' '; cout << '\n'; 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...