Submission #899370

# Submission time Handle Problem Language Result Execution time Memory
899370 2024-01-05T22:49:12 Z box Road Construction (JOI21_road_construction) C++17
65 / 100
10000 ms 114996 KB
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#define bug(x) cerr << "L" << __LINE__ << " | " << #x << " => " << x << endl
#else
#define bug(x)
#define cerr if (0) cerr
#endif

#define ar array
#define sz(v) int(std::size(v))
#define all(v) std::begin(v), std::end(v)
using i64 = long long;
using vi = vector<int>;
using pi = pair<int, int>;

const int MAXN = 25e4;

int N, K;
i64 X[MAXN], Y[MAXN], x[MAXN], y[MAXN];
vector<i64> vx, vy;
vi at_x[MAXN];
int tr[MAXN + 1];

const int MAXS = MAXN * 20;

int lc[MAXS], rc[MAXS], sum[MAXS];
int tt;

void inc(int &k, int l, int r, int i) {
    ++tt;
    lc[tt] = lc[k], rc[tt] = rc[k], sum[tt] = sum[k] + 1;
    k = tt;
    if (l < r) {
        int m = (l + r) / 2;
        i <= m ? inc(lc[k], l, m, i) : inc(rc[k], m + 1, r, i);
    }
}

int qry(int k, int l, int r, int ql, int qr) {
    if (ql <= l && qr >= r) return sum[k];
    int m = (l + r) / 2, x = 0;
    if (ql <= m && lc[k]) x += qry(lc[k], l, m, ql, qr);
    if (qr > m && rc[k]) x += qry(rc[k], m + 1, r, ql, qr);
    return x;
}

int get_count(i64 c) {
    int num = 0;
    for (int i = 0; i < N; i++) {
        int l = lower_bound(all(vy), Y[i] - c) - begin(vy);
        int r = upper_bound(all(vy), Y[i] + c) - begin(vy) - 1;
        int d = lower_bound(all(vx), X[i] - c) - begin(vx);
        int u = upper_bound(all(vx), X[i] + c) - begin(vx) - 1;
        int now = qry(tr[u + 1], 0, sz(vy) - 1, l, r) - qry(tr[d], 0, sz(vy) - 1, l, r) - 1;
        num += now;
        if (num > K * 2) return K + 1;
    }
    return num / 2;
}

vector<i64> ans;
set<i64> open;
vi add[MAXN], del[MAXN];
set<pair<i64, int>> active;

void add_ans(i64 x) {
    if (open.count(x)) open.erase(x);
    else open.insert(x), ans.push_back(x);
}

i64 dist(int i, int j) {
    return max(abs(i64(X[i]) - X[j]), abs(i64(Y[i]) - Y[j]));
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> N >> K;
    for (int i = 0; i < N; i++) {
        cin >> X[i] >> Y[i];
        tie(X[i], Y[i]) = pi(X[i] - Y[i], X[i] + Y[i]);
    }
    vx = vector(X, X + N), vy = vector(Y, Y + N);
    sort(all(vx)), vx.erase(unique(all(vx)), end(vx));
    sort(all(vy)), vy.erase(unique(all(vy)), end(vy));
    for (int i = 0; i < N; i++) {
        x[i] = lower_bound(all(vx), X[i]) - begin(vx);
        y[i] = lower_bound(all(vy), Y[i]) - begin(vy);
        at_x[x[i]].push_back(i);
    }
    for (int i = 0; i < sz(vx); i++) {
        tr[i + 1] = tr[i];
        for (int j : at_x[i]) inc(tr[i + 1], 0, sz(vy) - 1, y[j]);
    }
    i64 low = 0, hi = 4e9;
    while (low < hi) {
        i64 m = (low + hi) / 2 + 1;
        get_count(m) <= K ? low = m : hi = m - 1;
    }
    i64 c = low;
    for (int i = 0; i < N; i++) {
        int d = lower_bound(all(vx), X[i] - c) - begin(vx);
        int u = upper_bound(all(vx), X[i] + c) - begin(vx) - 1;
        add[d].push_back(i);
        del[u].push_back(i);
    }
    for (int i = 0; i < sz(vx); i++) {
        for (int j : add[i]) active.insert({Y[j], j});
        for (int j : at_x[i])
            for (auto it = active.lower_bound({Y[j] - c, -1}); it != end(active) && it->first <= Y[j] + c; ++it)
                if (j != it->second) add_ans(dist(j, it->second));
        for (int j : del[i]) active.erase({Y[j], j});
    }
    for (auto x : ans) bug(x);
    // assert(get_count(c) == sz(ans));
    while (sz(ans) < K) ans.push_back(c + 1);
    sort(all(ans));
    for (auto x : ans) cout << x << '\n';
}

Compilation message

road_construction.cpp: In function 'int main()':
road_construction.cpp:116:15: warning: unused variable 'x' [-Wunused-variable]
  116 |     for (auto x : ans) bug(x);
      |               ^
# Verdict Execution time Memory Grader output
1 Correct 210 ms 35772 KB Output is correct
2 Correct 205 ms 35520 KB Output is correct
3 Correct 199 ms 37824 KB Output is correct
4 Correct 211 ms 37956 KB Output is correct
5 Correct 187 ms 31808 KB Output is correct
6 Correct 10 ms 27228 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4581 ms 108080 KB Output is correct
2 Correct 4627 ms 108084 KB Output is correct
3 Correct 173 ms 37712 KB Output is correct
4 Correct 3929 ms 114812 KB Output is correct
5 Correct 3582 ms 114780 KB Output is correct
6 Correct 3442 ms 114996 KB Output is correct
7 Correct 2891 ms 103804 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6248 ms 104380 KB Output is correct
2 Correct 6900 ms 105116 KB Output is correct
3 Correct 6 ms 27228 KB Output is correct
4 Correct 2477 ms 111552 KB Output is correct
5 Correct 1500 ms 69460 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6248 ms 104380 KB Output is correct
2 Correct 6900 ms 105116 KB Output is correct
3 Correct 6 ms 27228 KB Output is correct
4 Correct 2477 ms 111552 KB Output is correct
5 Correct 1500 ms 69460 KB Output is correct
6 Correct 8292 ms 104128 KB Output is correct
7 Correct 9163 ms 104132 KB Output is correct
8 Correct 6 ms 27228 KB Output is correct
9 Correct 8 ms 27228 KB Output is correct
10 Correct 8356 ms 109452 KB Output is correct
11 Correct 2197 ms 114528 KB Output is correct
12 Correct 1594 ms 74868 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 210 ms 35772 KB Output is correct
2 Correct 205 ms 35520 KB Output is correct
3 Correct 199 ms 37824 KB Output is correct
4 Correct 211 ms 37956 KB Output is correct
5 Correct 187 ms 31808 KB Output is correct
6 Correct 10 ms 27228 KB Output is correct
7 Correct 5032 ms 64116 KB Output is correct
8 Correct 4756 ms 64152 KB Output is correct
9 Correct 192 ms 37732 KB Output is correct
10 Correct 4018 ms 61128 KB Output is correct
11 Correct 1530 ms 62280 KB Output is correct
12 Correct 676 ms 47388 KB Output is correct
13 Correct 712 ms 47756 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 210 ms 35772 KB Output is correct
2 Correct 205 ms 35520 KB Output is correct
3 Correct 199 ms 37824 KB Output is correct
4 Correct 211 ms 37956 KB Output is correct
5 Correct 187 ms 31808 KB Output is correct
6 Correct 10 ms 27228 KB Output is correct
7 Correct 4581 ms 108080 KB Output is correct
8 Correct 4627 ms 108084 KB Output is correct
9 Correct 173 ms 37712 KB Output is correct
10 Correct 3929 ms 114812 KB Output is correct
11 Correct 3582 ms 114780 KB Output is correct
12 Correct 3442 ms 114996 KB Output is correct
13 Correct 2891 ms 103804 KB Output is correct
14 Correct 6248 ms 104380 KB Output is correct
15 Correct 6900 ms 105116 KB Output is correct
16 Correct 6 ms 27228 KB Output is correct
17 Correct 2477 ms 111552 KB Output is correct
18 Correct 1500 ms 69460 KB Output is correct
19 Correct 8292 ms 104128 KB Output is correct
20 Correct 9163 ms 104132 KB Output is correct
21 Correct 6 ms 27228 KB Output is correct
22 Correct 8 ms 27228 KB Output is correct
23 Correct 8356 ms 109452 KB Output is correct
24 Correct 2197 ms 114528 KB Output is correct
25 Correct 1594 ms 74868 KB Output is correct
26 Correct 5032 ms 64116 KB Output is correct
27 Correct 4756 ms 64152 KB Output is correct
28 Correct 192 ms 37732 KB Output is correct
29 Correct 4018 ms 61128 KB Output is correct
30 Correct 1530 ms 62280 KB Output is correct
31 Correct 676 ms 47388 KB Output is correct
32 Correct 712 ms 47756 KB Output is correct
33 Execution timed out 10085 ms 100948 KB Time limit exceeded
34 Halted 0 ms 0 KB -