From 86edd7a03ed6a6598b23266050440f2c4e2a1968 Mon Sep 17 00:00:00 2001 From: Baoshuo Date: Tue, 31 Jan 2023 14:56:38 +0800 Subject: [PATCH] =?UTF-8?q?#1875.=20=E3=80=90LOJ3491=E3=80=91=E3=80=8CJOIS?= =?UTF-8?q?C=202021=20Day2=E3=80=8D=E9=81=93=E8=B7=AF=E5=BB=BA=E8=AE=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://sjzezoj.com/submission/67705 --- S2OJ/1875/1875.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 S2OJ/1875/1875.cpp diff --git a/S2OJ/1875/1875.cpp b/S2OJ/1875/1875.cpp new file mode 100644 index 00000000..e5a97c88 --- /dev/null +++ b/S2OJ/1875/1875.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include +#include + +using std::cin; +using std::cout; +const char endl = '\n'; + +const long long INF = 0x3f3f3f3f'3f3f3f3f; + +int n, k; +std::vector> points; + +bool check(long long x) { + int cnt = 0; + std::queue> q; + std::set> set; + + for (auto o : points) { + while (!q.empty() && q.front().first + x < o.first) { + set.erase({q.front().second, q.front().first}); + q.pop(); + } + + cnt += std::distance(set.lower_bound({o.second - x, -INF}), set.upper_bound({o.second + x, INF})); + + if (cnt >= k) return true; + + set.emplace(o.second, o.first); + q.emplace(o); + } + + return false; +} + +int main() { + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + cin >> n >> k; + + for (int i = 1, x, y; i <= n; i++) { + cin >> x >> y; + + points.emplace_back(x + y, x - y); + } + + std::sort(points.begin(), points.end()); + + long long l = 0, + r = INF, + res; + + while (l <= r) { + long long mid = (l + r) >> 1; + + if (check(mid)) { + res = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + + std::vector ans; + std::queue> q; + std::set> set; + + for (auto o : points) { + while (!q.empty() && q.front().first + res - 1 < o.first) { + set.erase({q.front().second, q.front().first}); + q.pop(); + } + + std::transform( + set.lower_bound({o.second - res + 1, -INF}), + set.upper_bound({o.second + res - 1, INF}), + std::back_inserter(ans), + [&](const std::pair& item) -> long long { + return std::max(std::abs(item.first - o.second), o.first - item.second); + }); + + set.emplace(o.second, o.first); + q.emplace(o); + } + + std::sort(ans.begin(), ans.end()); + ans.resize(k, res); + + for (auto x : ans) cout << x << endl; + + return 0; +} +