Submission #217675

#TimeUsernameProblemLanguageResultExecution timeMemory
217675VEGAnnCircle selection (APIO18_circle_selection)C++14
7 / 100
3092 ms45948 KiB
#include <bits/stdc++.h>
#define all(x) x.begin(),x.end()
#define sz(x) ((int)x.size())
#define PB push_back
#define pii pair<int,int>
#define ft first
#define sd second
#define MP make_pair
using namespace std;
typedef long long ll;
const int N = 300100;
const int M = 200100;
const int oo = 2e9 + 7;
set<pii, greater<pii> > bst;
vector<int> xs;
int x[N], y[N], r[N], n, mrk[N], nm[N], obr[N];
pii st[2][4 * N], BAD = MP(-oo, -oo);

ll sqr(ll x){ return (x * x);}

bool cmp(int _x, int _y){
    return x[_x] < x[_y];
}

void build(int v, int l, int r1){
    if (l == r1){
        st[0][v] = MP(r[nm[l]] + x[nm[l]], nm[l]);
        st[1][v] = MP(r[nm[l]] - x[nm[l]], nm[l]);
        bst.insert(MP(r[nm[l]], -nm[l]));
        return;
    }

    int md = (l + r1) >> 1;
    build(v + v, l, md);
    build(v + v + 1, md + 1, r1);

    st[0][v] = max(st[0][v + v], st[0][v + v + 1]);
    st[1][v] = max(st[1][v + v], st[1][v + v + 1]);
}

void update(int v, int l, int r, int ps){
    if (l == r){
        st[0][v] = st[1][v] = BAD;
        return;
    }
    int md = (l + r) >> 1;

    if (ps <= md)
        update(v + v, l, md, ps);
    else update(v + v + 1, md + 1, r, ps);

    st[0][v] = max(st[0][v + v], st[0][v + v + 1]);
    st[1][v] = max(st[1][v + v], st[1][v + v + 1]);
}

pii get(int tp, int v, int tl, int tr, int l, int r){
    if (l > r) return BAD;
    if (tl == l && tr == r) return st[tp][v];

    int md = (tl + tr) >> 1;
    return max(get(tp, v + v, tl, md, l, min(r, md)),
               get(tp, v + v + 1, md + 1, tr, max(md + 1, l), r));
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

//    freopen("in.txt","r",stdin);

    cin >> n;

    bool ok = 1;

    for (int i = 0; i < n; i++) {
        cin >> x[i] >> y[i] >> r[i];
        xs.PB(x[i]);
        nm[i] = i;
        ok &= bool(y[i] == 0);
    }

    fill(mrk, mrk + n, -1);

    if (ok){
        sort(nm, nm + n, cmp);
        sort(all(xs));

        bst.clear();
        build(1, 0, n - 1);

        for (int i = 0; i < n; i++)
            obr[nm[i]] = i;

        while (sz(bst) > 0){
            pii CUR = (*bst.begin());
            bst.erase(bst.begin());
            int mx = CUR.ft, nm = -CUR.sd;
            mrk[nm] = nm;

            update(1, 0, n - 1, obr[nm]);

            int loc = lower_bound(all(xs), x[nm]) - xs.begin();

            while (1){
                pii cr = get(0, 1, 0, n - 1, 0, loc - 1);

                if (cr.ft < -r[nm] + x[nm]) break;

                bst.erase(MP(r[cr.sd], -cr.sd));
                mrk[cr.sd] = nm;
                update(1, 0, n - 1, cr.sd);
            }

            while (1){
                pii cr = get(1, 1, 0, n - 1, loc, n - 1);

                if (cr.ft < -r[nm] - x[nm]) break;

                bst.erase(MP(r[cr.sd], -cr.sd));
                mrk[cr.sd] = nm;
                update(1, 0, n - 1, cr.sd);
            }
        }

        for (int i = 0; i < n; i++)
            cout << mrk[i] + 1 << " ";
        return 0;
    }

    int kol = n;

    for (; kol > 0; ){
        int nom = -1, mx = -1;

        for (int i = 0; i < n; i++){
            if (mrk[i] >= 0) continue;

            if (r[i] > mx){
                mx = r[i];
                nom = i;
            }
        }

        for (int i = 0; i < n; i++){
            if (mrk[i] >= 0) continue;

            ll cur = sqr(x[i] - x[nom]) + sqr(y[i] - y[nom]) - sqr(r[i] + r[nom]);

            if (cur <= 0){
                mrk[i] = nom;
                kol--;
            }
        }
    }

    for (int i = 0; i < n; i++)
        cout << mrk[i] + 1 << " ";

    return 0;
}

Compilation message (stderr)

circle_selection.cpp: In function 'int main()':
circle_selection.cpp:96:17: warning: unused variable 'mx' [-Wunused-variable]
             int mx = CUR.ft, nm = -CUR.sd;
                 ^~
#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...