106132024-04-06 15:17:49Valaki2Drónfutárcpp17Wrong answer 0/100354ms30288 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll 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++) {
        y[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++) {
        y[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
1Accepted3ms1908 KiB
2Accepted349ms28308 KiB
subtask20/15
3Accepted4ms2740 KiB
4Accepted4ms2700 KiB
5Accepted4ms2700 KiB
6Wrong answer4ms2956 KiB
7Accepted3ms2980 KiB
subtask30/15
8Accepted4ms2740 KiB
9Accepted4ms2700 KiB
10Accepted4ms2700 KiB
11Wrong answer4ms2956 KiB
12Accepted3ms2980 KiB
13Accepted4ms3104 KiB
14Accepted4ms3240 KiB
15Accepted4ms3164 KiB
16Accepted4ms3164 KiB
17Accepted4ms3572 KiB
subtask40/35
18Accepted4ms2740 KiB
19Accepted4ms2700 KiB
20Accepted4ms2700 KiB
21Wrong answer4ms2956 KiB
22Accepted3ms2980 KiB
23Accepted4ms3104 KiB
24Accepted4ms3240 KiB
25Accepted4ms3164 KiB
26Accepted4ms3164 KiB
27Accepted4ms3572 KiB
28Accepted4ms3420 KiB
29Accepted67ms9308 KiB
30Accepted98ms10520 KiB
31Accepted100ms10796 KiB
32Wrong answer76ms14732 KiB
subtask50/35
33Accepted4ms2740 KiB
34Accepted4ms2700 KiB
35Accepted4ms2700 KiB
36Wrong answer4ms2956 KiB
37Accepted3ms2980 KiB
38Accepted4ms3104 KiB
39Accepted4ms3240 KiB
40Accepted4ms3164 KiB
41Accepted4ms3164 KiB
42Accepted4ms3572 KiB
43Accepted4ms3420 KiB
44Accepted67ms9308 KiB
45Accepted98ms10520 KiB
46Accepted100ms10796 KiB
47Wrong answer76ms14732 KiB
48Accepted170ms17164 KiB
49Wrong answer354ms30052 KiB
50Accepted354ms29920 KiB
51Accepted354ms30060 KiB
52Accepted354ms30288 KiB