106092024-04-06 14:42:27Valaki2Drónfutárcpp17Time limit exceeded 15/100564ms54528 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second

const int maxn = 1e5;

struct edge {
    int a, b;
    int wei;
    bool operator < (const edge & other) const {
        return wei < other.wei;
    }
};

int n;
int x[1 + maxn], y[1 + maxn];

vector<pii > endpoints;

void add(int a, int b) {
    endpoints.pb(mp(min(a, b), max(a, b)));
}

struct point {
    int x, y, idx;
    bool operator < (const point &other) const {
        return x + y < other.x + other.y;
    }
};

map<int, int> m;

void find_batch() {
    vector<point> points;
    for(int i = 1; i <= n; i++) {
        points.pb(point{x[i], y[i], i});
    }
    sort(points.begin(), points.end());
    for(point cur : points) {
        auto it = m.lower_bound(cur.x - cur.y);
        while(it != m.end()) {
            int other = it->se;
            if(x[other] > x[cur.idx]) {
                break;
            }
            it = m.erase(it);
            add(other, cur.idx);
        }
        m[cur.x - cur.y] = cur.idx;
    }
}

void find_relevant_edges() {
    find_batch();
    for(int i = 1; i <= n; i++) {
        x[i] *= -1;
    }
    find_batch();
    for(int i = 1; i <= n; i++) {
        swap(x[i], y[i]);
    }
    find_batch();
    for(int i = 1; i <= n; i++) {
        x[i] *= -1;
    }
    find_batch();
    for(int i = 1; i <= n; i++) {
        x[i] *= -1;
        y[i] *= -1;
    }
    find_batch();
    for(int i = 1; i <= n; i++) {
        x[i] *= -1;
    }
    find_batch();
    for(int i = 1; i <= n; i++) {
        swap(x[i], y[i]);
    }
    find_batch();
    for(int i = 1; i <= n; i++) {
        x[i] *= -1;
    }
    find_batch();
    sort(endpoints.begin(), endpoints.end());
    endpoints.resize(unique(endpoints.begin(), endpoints.end()) - endpoints.begin());
}

int par[1 + maxn];
int sz[1 + maxn];

void create_set(int a) {
    par[a] = a;
    sz[a] = 1;
}

int find_set(int a) {
    if(a == par[a]) {
        return a;
    }
    return find_set(par[a]);
}

bool union_sets(int a, int b) {
    a = find_set(a), b = find_set(b);
    if(a == b) {
        return false;
    }
    if(sz[a] > sz[b]) {
        swap(a, b);
    }
    sz[b] += sz[a];
    par[a] = b;
    return true;
}

void solve() {
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> x[i] >> y[i];
    }
    vector<edge> edges;
    find_relevant_edges();
    for(const pii &p : endpoints) {
        edges.pb(edge {p.fi, p.se, abs(x[p.fi] - x[p.se]) + abs(y[p.fi] - y[p.se])});
    }
    /*for(int i = 1; i <= n; i++) {
        for(int j = i + 1; j <= n; j++) {
            edges.pb(edge {i, j, abs(x[i] - x[j]) + abs(y[i] - y[j])});
        }
    }*/
    sort(edges.begin(), edges.end());
    for(int i = 1; i <= n; i++) {
        create_set(i);
    }
    int ans = 0;
    for(edge e : edges) {
        if(union_sets(e.a, e.b)) {
            ans = max(ans, e.wei);
        }
    }
    cout << ans << "\n";
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms2052 KiB
2Time limit exceeded563ms25108 KiB
subtask215/15
3Accepted8ms3552 KiB
4Accepted7ms3396 KiB
5Accepted8ms3652 KiB
6Accepted8ms3940 KiB
7Accepted4ms3212 KiB
subtask30/15
8Accepted8ms3552 KiB
9Accepted7ms3396 KiB
10Accepted8ms3652 KiB
11Accepted8ms3940 KiB
12Accepted4ms3212 KiB
13Accepted4ms3528 KiB
14Accepted8ms4056 KiB
15Accepted8ms4028 KiB
16Accepted7ms3972 KiB
17Accepted8ms4252 KiB
subtask40/35
18Accepted8ms3552 KiB
19Accepted7ms3396 KiB
20Accepted8ms3652 KiB
21Accepted8ms3940 KiB
22Accepted4ms3212 KiB
23Accepted4ms3528 KiB
24Accepted8ms4056 KiB
25Accepted8ms4028 KiB
26Accepted7ms3972 KiB
27Accepted8ms4252 KiB
28Accepted7ms4060 KiB
29Accepted125ms21332 KiB
30Accepted188ms30016 KiB
31Accepted193ms30252 KiB
32Accepted142ms38904 KiB
subtask50/35
33Accepted8ms3552 KiB
34Accepted7ms3396 KiB
35Accepted8ms3652 KiB
36Accepted8ms3940 KiB
37Accepted4ms3212 KiB
38Accepted4ms3528 KiB
39Accepted8ms4056 KiB
40Accepted8ms4028 KiB
41Accepted7ms3972 KiB
42Accepted8ms4252 KiB
43Accepted7ms4060 KiB
44Accepted125ms21332 KiB
45Accepted188ms30016 KiB
46Accepted193ms30252 KiB
47Accepted142ms38904 KiB
48Accepted328ms54528 KiB
49Time limit exceeded564ms26368 KiB
50Time limit exceeded559ms26448 KiB
51Time limit exceeded551ms26720 KiB
52Time limit exceeded564ms26648 KiB