Submission #487122

#TimeUsernameProblemLanguageResultExecution timeMemory
487122RedhoodCircle selection (APIO18_circle_selection)C++14
19 / 100
3095 ms233832 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define pb push_back
#define sz(x) (int)(x).size()
typedef long long ll;
typedef long double ld;
using namespace std;

//const int N = (int)3e5 + 10;

//struct seg{
//    int a[4*N];
//    int p[4*N];
//    void clr(int x){
//        fill(a , a + 4 * N , x);
//        fill(p , p + 4 * N , x);
//    }
//    void push(int v){
//
//    }
//    int get(int v , int tl , int tr , int l , int r){
//        if(tl == l && tr == r){
//            return a[v];
//        }
//        int mid = (tl + tr) >> 1 , v1 = v << 1;
//        push(v);
//
//    }
//};
vector < array < int , 3 > > c;
bool intersec(int i , int j){
    if(1ll * (c[i][2] + c[j][2]) * (c[i][2] + c[j][2]) >= 1ll * (c[i][0]-c[j][0])*(c[i][0]-c[j][0])
                                                                + 1ll * (c[i][1]-c[j][1])*(c[i][1]-c[j][1])){
            return true;
    }
    return false;
}
const int N = (int)3e5 * 2;

vector < int > ans;
struct SEG{
    vector < int > lst[4*N];

    void add(int v , int tl , int tr , int pos , int val){
        lst[v].pb(val);
        if(tl == tr)return;
        int mid = (tl + tr) >> 1 , v1 = v << 1;
        if(pos <= mid)
            add(v1 , tl , mid , pos , val);
        else
            add(v1 | 1,  mid + 1 , tr , pos, val);
    }
    void dlt(int v , int tl , int tr , int l , int r, int X){
        if(tl == l && tr ==r){
            for(auto &u : lst[v]){
                if(ans[u] == -1)
                    ans[u] = X;
            }
            lst[v].clear();
            return;
        }
        int mid = (tl + tr) >> 1 , v1 = v << 1;
        if(l <=mid)
            dlt(v1 , tl , mid , l , min(r , mid) , X);
        if(r > mid)
            dlt(v1 | 1, mid + 1,  tr, max(l , mid + 1) , r, X);

    }
}L, R;
signed main()
{
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n;
    cin >> n;

    c.resize(n);


    for(auto &i : c)
        cin >> i[0] >> i[1] >> i[2];


    bool Y = 1;
    for(auto &i : c)
        if(i[1] != 0)
            Y = 0;


    vector < int > p(n);
    iota(all(p) , 0);


    sort(all(p) , [&](int i , int j){
            if(c[i][2] == c[j][2]){
                return i < j;
         }
            return c[i][2] > c[j][2];
         });



    ans.resize(n , -1);

    if(Y){


        /// addd this shit


        vector < int > l(n) , r(n);
        vector < int > dots;
        for(int i = 0 ; i < n; ++i){
            l[i] = c[i][0] - c[i][2];
            r[i] = c[i][0] + c[i][2];
            dots.pb(l[i]);
            dots.pb(r[i]);

        }
        sort(all(dots));
        dots.erase(unique(all(dots)) , dots.end());

        /// zip it fuckvector < int > dots;

        for(int i = 0 ; i < n; ++i){
            l[i] = lower_bound(all(dots) , l[i]) - dots.begin();
            r[i] = lower_bound(all(dots) , r[i]) - dots.begin();


            R.add(1 , 0, N-1, r[i], i);
            L.add(1 , 0 , N-1 , l[i] , i);
        }

        for(int i : p){
            if(ans[i] != -1){
                continue;
            }
            R.dlt(1 , 0 , N- 1 , l[i],  r[i], i);
            L.dlt(1 , 0 , N - 1,  l[i] , r[i],  i);
        }

    }else{
    for(int i = 0 ; i < n; ++i){
        int bst = -1;
        for(int j = 0 ; j < i; ++j){
            if(ans[p[j]] == -1 && intersec(p[i], p[j])){
                bst = p[j];
                break;
            }
        }
        ans[p[i]] = bst;
    }

    }

    for(int i = 0; i < n; ++i){
        if(ans[i] == -1){
            cout << i + 1 << ' ';
        }else
            cout << ans[i] + 1 << ' ';
    }





    return 0;
}
/*
4 2 4
3 1 1 10
9 2 2 4
7 2 5 7
4 1 8 10
5 3
5 6
5 9
1 10

2 1 3
1 1 1 4
1 1 2 6
1 3
1 5
1 7


1 1 1
100000000 1 1 1
1


11
9 9 2
13 2 1
11 8 2
3 3 2
3 12 1
12 14 1
9 8 5
2 8 2
5 2 1
14 4 2
14 14 1



*/
#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...