Submission #51081

#TimeUsernameProblemLanguageResultExecution timeMemory
51081edisonhelloCircle selection (APIO18_circle_selection)C++11
49 / 100
3071 ms40596 KiB
#pragma GCC optimize("Ofast,unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,tune=native") #include<cstdio> #include<unordered_map> #include<vector> #include<utility> #include<algorithm> using namespace std; int n,pos[300005],ans[300005]; struct circle{ int x,y,r,i; } c[300005]; namespace std { template<> struct hash<pair<int,int>> { long long operator()(const pair<int,int> &a) const { return 1ll*a.first*1000000009+a.second; } }; } unordered_map<pair<int,int>,int> mp; vector<pair<int,int>> idxs[300005]; int rit(){ char c; int x=0; bool mi=0; while((c=getchar_unlocked())){ if(c=='-' || (c>='0' && c<='9'))break; } if(c=='-')mi=1; else x=c-'0'; while((c=getchar_unlocked())){ if(c<'0' || c>'9')break; x=x*10+(c&15); } return mi?-x:x; } int main(){ n=rit(); for(int i=0;i<n;++i){ c[i].x=rit(),c[i].y=rit(),c[i].r=rit(); c[i].i=i+1; } sort(c,c+n,[](const circle &a,const circle &b){ return a.r==b.r?a.i<b.i:a.r>b.r; }); // for(int i=0;i<n;++i)pos[c[i].i]=i; int masterPtr=0; int D=c[0].r,killcount=0; auto buildGraph=[&](){ for(int i=1;i<=int(mp.size());++i)idxs[i].clear(); mp.clear(); D=c[masterPtr].r; killcount=0; for(int i=masterPtr;i<n;++i){ if(c[i].i==0)continue; pair<int,int> pos(c[i].x/D,c[i].y/D); int &it=mp[pos]; if(it)idxs[it].emplace_back(i,idxs[it].size()+1); else it=mp.size(),idxs[it].emplace_back(i,idxs[it].size()+1); // cout<<"insert "<<i<<" into "<<it<<" , pos: "<<pos.first<<" , "<<pos.second<<endl; } }; buildGraph(); while(masterPtr<n){ while(masterPtr<n && c[masterPtr].i==0)++masterPtr; if(masterPtr>=n)break; // cout<<"now masterPtr: "<<masterPtr<<" circle is "<<c[masterPtr].i<<endl; // cout<<"circle position: "<<c[masterPtr].x<<" "<<c[masterPtr].y<<endl; if(D/c[masterPtr].r>=100 || killcount>=8000){ buildGraph(); // cout<<"map contains: "<<endl; // for(auto p:mp)cout<<"[("<<p.first.first<<" , "<<p.first.second<<") : "<<p.second<<"] "; // cout<<endl; } pair<int,int> pos(c[masterPtr].x/D,c[masterPtr].y/D); // cout<<"base position: "<<pos.first<<" "<<pos.second<<endl; for(int dx=-2;dx<=2;++dx){ for(int dy=-2;dy<=2;++dy){ auto it=mp.find(make_pair(pos.first+dx,pos.second+dy)); if(it==mp.end())continue; // cout<<"it's not the end: "<<it->second<<endl; int prv=-1; for(int ix=0;ix<idxs[it->second].size();){ // for(auto &i:idxs[it->second]){ auto i=idxs[it->second][ix]; if(1ll*(c[i.first].x-c[masterPtr].x)*(c[i.first].x-c[masterPtr].x)+1ll*(c[i.first].y-c[masterPtr].y)*(c[i.first].y-c[masterPtr].y)<=1ll*(c[masterPtr].r+c[i.first].r)*(c[masterPtr].r+c[i.first].r)){ ans[c[i.first].i]=c[masterPtr].i; if(c[i.first].i!=c[masterPtr].i)c[i.first].i=0; ++killcount; if(prv!=-1)idxs[it->second][prv].second=i.second; } prv=ix; ix=i.second; } } } c[masterPtr].i=0; } for(int i=1;i<=n;++i){ printf("%d ",ans[i]); } }

Compilation message (stderr)

circle_selection.cpp: In function 'int main()':
circle_selection.cpp:81:32: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(int ix=0;ix<idxs[it->second].size();){
                              ~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...