Submission #111532

#TimeUsernameProblemLanguageResultExecution timeMemory
111532imaxblueCircle selection (APIO18_circle_selection)C++17
100 / 100
2811 ms49392 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define mp make_pair #define pb push_back #define x first #define y second #define pii pair<int, int> #define p3i pair<pii, int> #define pll pair<ll, ll> #define p3l pair<pll, ll> #define vi vector<int> #define vpii vector<pii> #define vp3i vector<p3i> #define vpll vector<pll> #define vp3l vector<p3l> #define lseg L, (L+R)/2, N*2+1 #define rseg (L+R)/2+1, R, N*2+2 #define ub upper_bound #define lb lower_bound #define pq priority_queue #define MN 1000000007 #define fox(k, x) for (int k=0; k<x; ++k) #define fox1(k, x) for (int k=1; k<=x; ++k) #define foxr(k, x) for (int k=x-1; k>=0; --k) #define fox1r(k, x) for (int k=x; k>0; --k) #define ms multiset #define flood(x) memset(x, 0x3f3f3f3f, sizeof x) #define drain(x) memset(x, 0, sizeof x) #define rng() ((rand() << 14)+rand()) #define scan(X) do{while((X=getchar())<'0'); for(X-='0'; '0'<=(_=getchar()); X=(X<<3)+(X<<1)+_-'0');}while(0) char _; #define pi 3.14159265358979323846 int n, x[300005], y[300005], r[300005], sz; int u[300005]; vector<pii> v; vector<p3i> w; vector<pair<int, vector<pair<int, vector<int> > > > > co; void construct(){ int X, Y, R, I; co.clear(); //cout << "!" << endl; //cout << u[5] << ' ' <<w.size() << "%" << endl; w.clear(); fox(l, n){ if (u[l] == 0) w.pb(mp(mp(x[l]/sz, y[l]/sz), l)); } sort(w.begin(), w.end()); fox(l, w.size()){ X = w[l].x.x; Y = w[l].x.y; I = w[l].y; //if (u[I]) continue; //cout << ' ' << X << ' ' << Y << ' ' << I << endl; if (co.empty() || co.back().x != X) co.pb(mp(X, vector<pair<int, vector<int> > >())); if (co.back().y.empty() || co.back().y.back().x != Y) co.back().y.pb(mp(Y, vector<int>())); //if (I==5 || I == 10) cout << "*" << X << ' ' << Y << ' ' << co.back().y.back().y.size()<< endl; co.back().y.back().y.pb(I); //if (I == 5 || ) cout << co.back().x << ' ' << co.back().y.back().x << ' ' << endl; } } void query(int P, int Cx, int Cy){ int I, I2, P2; I = lb(co.begin(), co.end(), mp(Cx, vector<pair<int, vector<int> > >())) - co.begin();; if (I == co.size() || co[I].x != Cx) return; //if (P == 5) cout << "*"; I2 = lb(co[I].y.begin(), co[I].y.end(), mp(Cy, vector<int>())) - co[I].y.begin(); //if (P == 5) cout << I << ' ' << I2 << ' ' << co[I].y[I2].x << ' ' << Cy << endl; if (I2 == co[I].y.size() || co[I].y[I2].x != Cy) return; vector<int> tmp = co[I].y[I2].y; //if (P == 5) cout << tmp.size() << endl; fox(l, tmp.size()){ P2 = tmp[l]; //if (P == 5) cout << P2 << endl; if (u[P2]) continue; if (1LL*(x[P]-x[P2])*(x[P]-x[P2])+1LL*(y[P]-y[P2])*(y[P]-y[P2]) <= 1LL*(r[P]+r[P2])*(r[P]+r[P2])){ u[P2] = P+1; } } } int32_t main(){ scanf("%i", &n); sz = 2000000001; //co.pb(mp(0, vector<int>())); //co[0].y.pb(mp(0, vector<int>())); fox(l, n){ scanf("%i %i %i", &x[l], &y[l], &r[l]); v.pb(mp(-r[l], l)); w.pb(mp(mp(x[l], y[l]), l)); //co[0].y[0].y.pb(l); } sort(v.begin(), v.end()); sort(w.begin(), w.end()); construct(); fox(l, v.size()){ v[l].x *= -1; if (u[v[l].y]) continue; while(v[l].x <= sz/4){ //cout << v[l].x << ' ' << sz << endl; sz/=2; construct(); } //cout << v[l].y << ' ' << sz << endl; //continue; query(v[l].y, x[v[l].y]/sz-1, y[v[l].y]/sz+1); query(v[l].y, x[v[l].y]/sz-1, y[v[l].y]/sz); query(v[l].y, x[v[l].y]/sz-1, y[v[l].y]/sz-1); query(v[l].y, x[v[l].y]/sz, y[v[l].y]/sz+1); query(v[l].y, x[v[l].y]/sz, y[v[l].y]/sz); query(v[l].y, x[v[l].y]/sz, y[v[l].y]/sz-1); query(v[l].y, x[v[l].y]/sz+1, y[v[l].y]/sz+1); query(v[l].y, x[v[l].y]/sz+1, y[v[l].y]/sz); query(v[l].y, x[v[l].y]/sz+1, y[v[l].y]/sz-1); } fox(l, n){ printf("%i ", u[l]); } 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 */

Compilation message (stderr)

circle_selection.cpp: In function 'void construct()':
circle_selection.cpp:23:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define fox(k, x) for (int k=0; k<x; ++k)
circle_selection.cpp:51:7:
   fox(l, w.size()){
       ~~~~~~~~~~~                 
circle_selection.cpp:51:3: note: in expansion of macro 'fox'
   fox(l, w.size()){
   ^~~
circle_selection.cpp:41:13: warning: unused variable 'R' [-Wunused-variable]
   int X, Y, R, I;
             ^
circle_selection.cpp: In function 'void query(int, int, int)':
circle_selection.cpp:65:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (I == co.size() || co[I].x != Cx) return;
       ~~^~~~~~~~~~~~
circle_selection.cpp:69:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (I2 == co[I].y.size() || co[I].y[I2].x != Cy) return;
       ~~~^~~~~~~~~~~~~~~~~
circle_selection.cpp:23:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define fox(k, x) for (int k=0; k<x; ++k)
circle_selection.cpp:72:7:
   fox(l, tmp.size()){
       ~~~~~~~~~~~~~               
circle_selection.cpp:72:3: note: in expansion of macro 'fox'
   fox(l, tmp.size()){
   ^~~
circle_selection.cpp: In function 'int32_t main()':
circle_selection.cpp:23:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define fox(k, x) for (int k=0; k<x; ++k)
circle_selection.cpp:95:7:
   fox(l, v.size()){
       ~~~~~~~~~~~                 
circle_selection.cpp:95:3: note: in expansion of macro 'fox'
   fox(l, v.size()){
   ^~~
circle_selection.cpp:82:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%i", &n);
   ~~~~~^~~~~~~~~~
circle_selection.cpp:87:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%i %i %i", &x[l], &y[l], &r[l]);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...