Submission #1263498

#TimeUsernameProblemLanguageResultExecution timeMemory
1263498RoupiqCircle selection (APIO18_circle_selection)C++20
15 / 100
3094 ms25884 KiB
#include <bits/stdc++.h>
using namespace std;

struct DSU {
    vector<int> p, sz;
    DSU(int n): p(n), sz(n,1){ iota(p.begin(), p.end(), 0); }
    int find(int a){ return p[a]==a?a:p[a]=find(p[a]); }
    void unite(int a,int b){
        a=find(a); b=find(b);
        if(a==b) return;
        if(sz[a]<sz[b]) swap(a,b);
        p[b]=a; sz[a]+=sz[b];
    }
};

struct Circle {
    long long x,y,r;
    int id;
};

inline bool intersect(const Circle&a,const Circle&b){
    __int128 dx=a.x-b.x;
    __int128 dy=a.y-b.y;
    __int128 dist2=dx*dx+dy*dy;
    __int128 sum=a.r+b.r;
    return dist2 <= sum*sum;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n; cin>>n;
    vector<Circle> c(n);
    for(int i=0;i<n;i++){
        cin>>c[i].x>>c[i].y>>c[i].r;
        c[i].id=i;
    }

    struct Event{
        long long x; int id; bool enter;
    };
    vector<Event> ev;
    ev.reserve(2*n);
    for(auto &ci:c){
        ev.push_back({ci.x-ci.r, ci.id, true});
        ev.push_back({ci.x+ci.r, ci.id, false});
    }
    sort(ev.begin(), ev.end(), [](auto&a,auto&b){
        if(a.x!=b.x) return a.x<b.x;
        return a.enter > b.enter; // wejście przed wyjściem
    });

    DSU dsu(n);

    // aktywne: posortowane po y
    set<pair<long long,int>> active;

    for(auto&e:ev){
        int id=e.id;
        if(e.enter){
            // sprawdzamy kolizje tylko z sąsiadami w pobliżu Y
            // (tu uproszczone: sprawdzamy wszystkich aktywnych)
            for(auto [y,j]:active){
                if(intersect(c[id], c[j])) dsu.unite(id,j);
            }
            active.insert({c[id].y,id});
        } else {
            active.erase({c[id].y,id});
        }
    }

    // znajdź lidera każdej składowej
    vector<int> leader(n);
    for(int i=0;i<n;i++) leader[dsu.find(i)]=i;
    for(int i=0;i<n;i++){
        int r=dsu.find(i);
        int j=leader[r];
        if(c[i].r>c[j].r || (c[i].r==c[j].r && c[i].id< c[j].id))
            leader[r]=i;
    }

    // odpowiedzi
    vector<int> ans(n);
    for(int i=0;i<n;i++)
        ans[i]=leader[dsu.find(i)]+1;

    for(int i=0;i<n;i++){
        if(i) cout<<" ";
        cout<<ans[i];
    }
    cout<<"\n";
}
#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...