Submission #641526

#TimeUsernameProblemLanguageResultExecution timeMemory
641526skittles1412Road Construction (JOI21_road_construction)C++17
100 / 100
2525 ms13580 KiB
#include "bits/extc++.h"

using namespace std;

template <typename T>
void dbgh(const T& t) {
    cerr << t << endl;
}

template <typename T, typename... U>
void dbgh(const T& t, const U&... u) {
    cerr << t << " | ";
    dbgh(u...);
}

#ifdef DEBUG
#define dbg(...)                                           \
    cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]" \
         << ": ";                                          \
    dbgh(__VA_ARGS__)
#else
#define cerr   \
    if (false) \
    cerr
#define dbg(...)
#endif

#define endl "\n"
#define long int64_t
#define sz(x) int(std::size(x))

namespace __gnu_pbds {
template <typename T, typename U = less<T>>
using ost =
    tree<T, null_type, U, rb_tree_tag, tree_order_statistics_node_update>;
}

using __gnu_pbds::ost;

void solve() {
    int n, kv;
    cin >> n >> kv;
    pair<long, long> arr[n];
    for (auto& [x, y] : arr) {
        long cx, cy;
        cin >> cx >> cy;
        x = cx + cy;
        y = cx - cy;
    }
    sort(arr, arr + n);
    auto check = [&](long cv) -> bool {
        int cans = 0;
        queue<pair<long, int>> q;
        ost<pair<long, int>> s;
        for (int i = 0; i < n; i++) {
            auto& [x, y] = arr[i];
            while (sz(q) && q.front().first < x - cv) {
                int j = q.front().second;
                s.erase({arr[j].second, j});
                q.pop();
            }
            cans += int(s.order_of_key({y + cv + 1, -1}) -
                        s.order_of_key({y - cv, -1}));
            if (cans >= kv) {
                return false;
            }
            s.insert({y, i});
            q.emplace(x, i);
        }
        return true;
    };
    long l = 0, r = 1e10;
    while (l < r) {
        long mid = (l + r + 1) / 2;
        if (check(mid)) {
            l = mid;
        } else {
            r = mid - 1;
        }
    }
    vector<long> ans;
    queue<pair<long, int>> q;
    set<pair<long, int>> s;
    for (int i = 0; i < n; i++) {
        auto& [x, y] = arr[i];
        while (sz(q) && q.front().first < x - l) {
            int j = q.front().second;
            s.erase({arr[j].second, j});
            q.pop();
        }
        for (auto it = s.lower_bound({y - l, -1}),
                  end = s.lower_bound({y + l + 1, -1});
             it != end; ++it) {
            auto& [y1, j] = *it;
            ans.push_back(max(abs(x - arr[j].first), abs(y - y1)));
        }
        s.insert({y, i});
        q.emplace(x, i);
    }
    ans.resize(kv, l + 1);
    sort(begin(ans), end(ans));
    for (auto& a : ans) {
        cout << a << endl;
    }
}

int main() {
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    cin.exceptions(ios::failbit);
    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...