10616 2024. 04. 06 15:21:33 Valaki2 Drónfutár cpp17 Elfogadva 100/100 282ms 30400 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() {
    m.clear();
    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();
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1980 KiB
2 Elfogadva 282ms 28212 KiB
subtask2 15/15
3 Elfogadva 4ms 2680 KiB
4 Elfogadva 4ms 2892 KiB
5 Elfogadva 4ms 3108 KiB
6 Elfogadva 4ms 3348 KiB
7 Elfogadva 3ms 3460 KiB
subtask3 15/15
8 Elfogadva 4ms 2680 KiB
9 Elfogadva 4ms 2892 KiB
10 Elfogadva 4ms 3108 KiB
11 Elfogadva 4ms 3348 KiB
12 Elfogadva 3ms 3460 KiB
13 Elfogadva 4ms 3592 KiB
14 Elfogadva 4ms 3764 KiB
15 Elfogadva 4ms 3816 KiB
16 Elfogadva 4ms 3816 KiB
17 Elfogadva 4ms 3816 KiB
subtask4 35/35
18 Elfogadva 4ms 2680 KiB
19 Elfogadva 4ms 2892 KiB
20 Elfogadva 4ms 3108 KiB
21 Elfogadva 4ms 3348 KiB
22 Elfogadva 3ms 3460 KiB
23 Elfogadva 4ms 3592 KiB
24 Elfogadva 4ms 3764 KiB
25 Elfogadva 4ms 3816 KiB
26 Elfogadva 4ms 3816 KiB
27 Elfogadva 4ms 3816 KiB
28 Elfogadva 4ms 4076 KiB
29 Elfogadva 54ms 9640 KiB
30 Elfogadva 78ms 10932 KiB
31 Elfogadva 79ms 11144 KiB
32 Elfogadva 57ms 14964 KiB
subtask5 35/35
33 Elfogadva 4ms 2680 KiB
34 Elfogadva 4ms 2892 KiB
35 Elfogadva 4ms 3108 KiB
36 Elfogadva 4ms 3348 KiB
37 Elfogadva 3ms 3460 KiB
38 Elfogadva 4ms 3592 KiB
39 Elfogadva 4ms 3764 KiB
40 Elfogadva 4ms 3816 KiB
41 Elfogadva 4ms 3816 KiB
42 Elfogadva 4ms 3816 KiB
43 Elfogadva 4ms 4076 KiB
44 Elfogadva 54ms 9640 KiB
45 Elfogadva 78ms 10932 KiB
46 Elfogadva 79ms 11144 KiB
47 Elfogadva 57ms 14964 KiB
48 Elfogadva 134ms 17164 KiB
49 Elfogadva 277ms 30260 KiB
50 Elfogadva 277ms 30256 KiB
51 Elfogadva 277ms 30256 KiB
52 Elfogadva 275ms 30400 KiB