제출 #1366075

#제출 시각아이디문제언어결과실행 시간메모리
1366075khanhphucscratchCircle selection (APIO18_circle_selection)C++20
12 / 100
889 ms72916 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x[300005], y[300005], ra[300005];
int dis(int i, int j)
{
    int rex = (x[i] - x[j]), rey = (y[i] - y[j]);
    return rex*rex+rey*rey;
}
int ans[300005], l[300005], r[3000005];
bool deleted[300005];
signed main()
{
    int n; cin>>n;
    for(int i = 1; i <= n; i++) cin>>x[i]>>y[i]>>ra[i];
    //Subtask 2
    set<pair<int, int>> circle;
    set<pair<int, int>> lp, rp;
    for(int i = 1; i <= n; i++){
        l[i] = x[i] - ra[i];
        r[i] = x[i] + ra[i];
        lp.insert({l[i], i});
        rp.insert({r[i], i});
        circle.insert({-ra[i], i});
    }
    while(circle.size() > 0){
        int p = (*circle.begin()).second; circle.erase(circle.begin());
        ans[p] = p;
        set<pair<int, int>>::iterator it = rp.lower_bound({l[p], -1});
        while(it != rp.end() && (*it).first <= r[p]){
            int idx = (*it).second;
        //cerr<<"A"<<idx<<" "<<r[idx]<<" "<<l[p]<<" "<<r[p]<<endl;
            lp.erase({l[idx], idx}); circle.erase({-ra[idx], idx});
            ans[idx] = p;
            rp.erase(it++);
        }
        it = lp.lower_bound({l[p], -1});
        while(it != lp.end() && (*it).first <= r[p]){
            int idx = (*it).second;
            ans[idx] = p;
            rp.erase({r[idx], idx}); circle.erase({-ra[idx], idx});
            lp.erase(it++);
        }
    }
    for(int i = 1; i <= n; i++) cout<<ans[i]<<" ";
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…