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...