답안 #916916

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
916916 2024-01-26T18:39:47 Z makrav Road Construction (JOI21_road_construction) C++14
0 / 100
10000 ms 77272 KB
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef vector<int> vei;
typedef vector<vei> vevei;

#define all(a) (a).begin(), (a).end()
#define sz(a) (int) a.size()
#define con cout << "NO\n"
#define coe cout << "YES\n";
#define str string
#define pb push_back
#define ff first
#define sc second
#define ss second
#define pii pair<int, int>
#define mxe max_element
#define mne min_element
#define stf shrink_to_fit
#define f(i, l, r) for (int i = (l); i < (r); i++)
#define double ld
//#define int ll

const int MAXS = 20000000;
int S[MAXS];
pair<int, int> nxt[MAXS];
int siz = 1;

struct node {
    int sm;
    node* l = nullptr, *r = nullptr;
    node() = default;
    node(int sm_) {
        sm = sm_;
    }
};

int upd(int v, int tl, int tr, int p, int val) {
    if (tl + 1 == tr) {
        S[siz] = S[v] + val;
        nxt[siz] = {-1, -1};
        siz++;
        return siz - 1;
    }
    int ind = siz++;
    int tm = (tl + tr) / 2;
    if (p < tm) {
        if (nxt[v].ff == -1) {
            nxt[v].ff = siz++;
            S[siz - 1] = 0;
            nxt[siz - 1] = {-1, -1};
        }
        auto rs = upd(nxt[v].ff, tl, tm, p, val);
        nxt[ind].ff = rs;
        nxt[ind].sc = nxt[v].sc;
        S[ind] = S[rs];
        if (nxt[ind].sc != -1) S[ind] += S[nxt[ind].sc];
    }
    else {
        if (nxt[v].sc == -1) {
            nxt[v].sc = siz++;
            S[siz - 1] = 0;
            nxt[siz - 1] = {-1, -1};
        }
        auto rs = upd(nxt[v].sc, tm, tr, p, val);
        nxt[ind].ff = nxt[v].ff;
        nxt[ind].sc = rs;
        S[ind] = S[rs];
        if (nxt[ind].ff != -1) S[ind] += S[nxt[ind].ff];
    }
    return ind;
}

int get(int v, int tl, int tr, int l, int r) {
    if (v == -1) return 0;
    if (l <= tl && tr <= r) return S[v];
    if (tr <= l || tl >= r) return 0;
    int tm = (tl + tr) / 2;
    return get(nxt[v].ff, tl, tm, l, r) + get(nxt[v].sc, tm, tr, l, r);
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int n, k; cin >> n >> k;
    vector<pair<int, int>> a(n);
    for (int i = 0; i < n; i++) cin >> a[i].ff >> a[i].sc;

    vector<pair<int, int>> b(n), xs(n), ys(n);
    for (int i = 0; i < n; i++) {
        b[i] = {a[i].ff - a[i].sc, a[i].ff + a[i].sc};
        xs[i] = {b[i].ff, i};
        ys[i] = {b[i].sc, i};
    }   
    vector<int> posx(n), posy(n);
    sort(all(xs));
    sort(all(ys));
    vector<int> roots(n + 1);
    roots[0] = 0;
    S[0] = 0;
    nxt[0] = {-1, -1};
    f (i, 0, n) {
        posy[ys[i].sc] = i;
        posx[xs[i].sc] = i;
    }

    for (int i = 0; i < n; i++) {
        roots[i + 1] = upd(roots[i], 0, n, posy[i], 1);
    }
    //return 0;

    auto getrect = [&](ll lx, ll rx, ll ly, ll ry) {
        int li = lx, ri = rx, lj, rj;
        {
            int L = -1, R = n;
            while (R - L > 1) {
                int M = (L + R) / 2;
                if (ys[M].ff <= ry) L = M;
                else R = M;
            }
            rj = L;
        }
        {
            int L = -1, R = n;
            while (R - L > 1) {
                int M = (L + R) / 2;
                if (ys[M].ff >= ly) R = M;
                else L = M;
            }
            lj = R;
        }
        return get(roots[ri + 1], 0, n, lj, rj + 1) - get(roots[li], 0, n, lj, rj + 1);
    };

    ll L = -1, R = 4000000000ll;
    while (R - L > 1) {
        ll M = (L + R) / 2;
        ll sm = 0;

        vector<int> nextx(n), prevx(n);
        int ind = 0;
        f (i, 0, n) {
            while (ind + 1 < n && xs[ind + 1].ff - xs[i].ff <= M) ind++;
            nextx[i] = ind;
        }
        ind = n - 1;
        for (int i = n - 1; i >= 0; i--) {
            while (ind - 1 >= 0 && xs[i].ff - xs[ind - 1].ff <= M) ind--;
            prevx[i] = ind;
        }

        for (int i = 0; i < n; i++) {
            sm += getrect(prevx[posx[i]], nextx[posx[i]], b[i].sc - M, b[i].sc + M) - 1;
        }
        if (sm / 2 >= k) R = M;
        else L = M;
    }
    cout << R << '\n';

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10018 ms 77224 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10016 ms 77272 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 10016 ms 77272 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -