Submission #1260090

#TimeUsernameProblemLanguageResultExecution timeMemory
1260090hamanp87Circle selection (APIO18_circle_selection)C++20
100 / 100
940 ms18928 KiB
#include<bits/stdc++.h> using namespace std; using ll=long long; //#pragma GCC optimize("03,unroll-loops") //#pragma GCC target("avx2") //#pragma GCC target("sse4") #define all(v) v.begin(),v.end() #define F first #define S second #define pub push_back #define pob pop_back #define puf push_front #define pof pop_front //#define randi uniform_int_distribution<long long> #define damoon(v) v.resize(unique(all(v))-v.begin()) //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //randi dist(0,10000000000000000); typedef pair<int,int> pii; typedef pair<long long,long long> pll; typedef pair<int,bool> pib; typedef pair<long long,bool> plb; typedef pair<int,pii> pip; typedef pair<pii,int> ppi; typedef vector<int> veci; typedef vector<long long> vecl; typedef vector<bool> vecb; typedef vector<pii> vecp; typedef set<int> seti; typedef set<long long> setl; typedef set<pii> setp; typedef map<int,int> mapii; typedef map<long long,long long> mapll; typedef map<int,bool> mapib; typedef map<long long,bool> maplb; const int inf=1e9,mod=1e9+7,neginf=-1e9; const double PI=acos(-1); struct Circle { ll x,y,r; }; int n; ll Cel=LLONG_MAX; veci ans; vector<array<ll,3>> Cmp; vector<Circle> Cs; inline bool intersect(const Circle &a,const Circle &b) { ll dx=a.x-b.x; ll dy=a.y-b.y; ll R=a.r+b.r; return dx*dx+dy*dy<=R*R; } inline ll fl(ll a,ll b) { if(b<=0) b=1; if(a>=0) return a/b; return -((-a+b-1)/b); } inline bool cmpa(const array<ll,3> &a,const array<ll,3> &b) { if(a[0]!=b[0]) return a[0]<b[0]; if(a[1]!=b[1]) return a[1]<b[1]; return a[2]<b[2]; } inline bool cmpc(int a,int b) { if(Cs[a].r==Cs[b].r) return a<b; return Cs[a].r>Cs[b].r; } size_t LBS(const vector<array<ll,3>> &v,const array<ll,3> &k) { size_t L=0,R=v.size(); while(L<R) { size_t mid=(L+R)>>1; if(cmpa(v[mid],k)) L=mid+1; else R=mid; } return L; } void RB(ll nr) { Cel=max(1LL,2*nr); Cmp.clear(); Cmp.reserve(n); for(int i=0;i<n;i++) { if(ans[i]==-1) { ll cx=fl(Cs[i].x,Cel); ll cy=fl(Cs[i].y,Cel); Cmp.pub({cx,cy,i}); } } sort(all(Cmp),cmpa); } void solve() { cin>>n; Cs.assign(n,{}); for(int i=0;i<n;i++) cin>>Cs[i].x>>Cs[i].y>>Cs[i].r; ans.assign(n,-1); veci ord(n); iota(all(ord),0); sort(all(ord),cmpc); for(int ind:ord) { if(ans[ind]!=-1) continue; if(Cs[ind].r*4<Cel) RB(Cs[ind].r); ans[ind]=ind; ll cx=fl(Cs[ind].x,Cel); ll cy=fl(Cs[ind].y,Cel); for(ll x=cx-1;x<cx+2;x++) { array<ll,3> k={x,cy-1,-1}; size_t it=LBS(Cmp,k); while(it<Cmp.size() and Cmp[it][0]==x and Cmp[it][1]<=cy+1) { int j=(int)Cmp[it][2]; if(ans[j]==-1 and intersect(Cs[j],Cs[ind])) ans[j]=ind; it++; } } } for(int i=0;i<n;i++) cout<<ans[i]+1<<' '; cout<<"\n"; } int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); //ifstream fin("in.txt"); //ofstream fout("out.txt"); int t=1; //cin>>t; while(t--) { solve(); } }
#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...