Submission #1157987

#TimeUsernameProblemLanguageResultExecution timeMemory
1157987shnRoad Construction (JOI21_road_construction)C++20
0 / 100
10094 ms162348 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 pofik continue
#define int long long
#define pb push_back
#define F first
#define S second
const int N = 1e6 + 77, inf = 1e18 + 77;

int n, k;

int x[N][5], y[N][5];

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

int t[N * 2];

void upd(int pos, int x) {
    while (pos <= 3 * n) {
        t[pos] += x;
        pos += pos & -pos;
    }
}

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

int query(int l, int r) {
    return get(r) - get(l - 1);
}

bool check(int d) {
    int ans = 0;
    vector<pair<int, pair<int, pll>>> g;
    set<int> st;
    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);
        st.insert(a);
        st.insert(x[i][1]);
        st.insert(x[i][2]);
    }
    int o = 0;
    unordered_map<int, int> mp;
    for (int it : st) mp[it] = ++o;
    for (int i = 1; i <= n; i++) {
        int a = x[i][0], b = y[i][0];
        rotate(a, b);
        g.pb({b, {1, {mp[a], mp[a]}}});
        g.pb({y[i][1], {3, {mp[a], mp[a]}}});
        g.pb({b, {2, {mp[x[i][1]], mp[x[i][2]]}}});
    }
    sort(all(g));
    memset(t, 0, sizeof(t));
    for (auto it : g) {
        int y2 = it.F;
        int type = it.S.F;
        int l = it.S.S.F, r = it.S.S.S;
        if (type == 1) upd(l, 1);
        else if (type == 3) upd(l, -1);
        else ans += query(l, r) - 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) >> 1ll;
        if (check(mid)) {
            l = mid + 1;
        } else {
            res = mid;
            r = mid - 1;
        }
    }
    cout << res << '\n';
}

signed main() {
    Respaabs1equal2xdoner
    int T = 1;
    // cin >> T;
    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...