Submission #1157931

#TimeUsernameProblemLanguageResultExecution timeMemory
1157931shnRoad Construction (JOI21_road_construction)C++20
0 / 100
9420 ms92440 KiB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast,O3,unroll-loops")
#pragma GCC target("avx,avx2")
#define Respaabs1equal2xdoner cin.tie(nullptr)->sync_with_stdio(false);
#define pll pair < long long , long long >
#define len(s) (long long)(s.size())
#define all(x) x.begin(), x.end()
#define int long long
#define pb push_back
#define F first
#define S second
const int N = 75e4 + 77, inf = 1e18 + 77;

int n, k;
int x[N][5], y[N][5], t[N];

inline void rotate(int &a, int &b) {
    int c = a;
    a = a - b;
    b = c + b;
}

void upd(int pos, int val, int size) {
    while (pos <= size) {
        t[pos] += val;
        pos += pos & -pos;
    }
}

int get(int pos) {
    int sum = 0;
    while (pos) {
        sum += t[pos];
        pos -= pos & -pos;
    }
    return sum;
}

bool check(int d) {
    int ans = 0;
    vector<pair<int, int>> events;
    vector<int> coords;
    
    for (int i = 1; i <= n; i++) {
        int a = x[i][0], b = y[i][0];
        x[i][1] = a, y[i][1] = b + d;
        x[i][2] = a + d, y[i][2] = b;
        x[i][3] = a, y[i][3] = b - d;
        x[i][4] = a - d, y[i][4] = b;

        for (int j = 1; j <= 4; j++) rotate(x[i][j], y[i][j]);
        rotate(a, b);
        
        coords.pb(a);
        coords.pb(x[i][1]);
        coords.pb(x[i][2]);

        events.pb({b, 1});
        events.pb({y[i][1], -1});
    }

    sort(all(coords));
    coords.erase(unique(all(coords)), coords.end());

    auto get_comp = [&](int v) {
        return lower_bound(all(coords), v) - coords.begin() + 1;
    };

    vector<pair<int, pair<int, int>>> g;
    for (int i = 1; i <= n; i++) {
        int a = x[i][0], b = y[i][0];
        rotate(a, b);

        int l = get_comp(a), r1 = get_comp(x[i][1]), r2 = get_comp(x[i][2]);
        g.pb({b, {1, l}});
        g.pb({y[i][1], {-1, l}});
        g.pb({b, {2, r1}});
        g.pb({b, {2, r2}});
    }

    sort(all(g));

    int sz = coords.size();
    memset(t, 0, (sz + 5) * sizeof(int));

    for (auto it : g) {
        int type = it.S.F, pos = it.S.S;
        if (type == 1) upd(pos, 1, sz);
        else if (type == -1) upd(pos, -1, sz);
        else ans += get(pos) - 1;
    }

    return (ans < k);
}

void solve() {
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> x[i][0] >> y[i][0];
    }

    int l = 1, r = 4e9 - 1, res = 4e9;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (check(mid)) {
            l = mid + 1;
        } else {
            res = mid;
            r = mid - 1;
        }
    }
    cout << res << '\n';
}

signed main() {
    Respaabs1equal2xdoner
    int T = 1;
    while (T--) {
        solve();
    }
}
#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...