106152024-04-06 15:20:48Valaki2Drónfutárcpp17Wrong answer 0/100293ms29720 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
1Accepted3ms1844 KiB
2Accepted293ms28248 KiB
subtask20/15
3Accepted4ms2592 KiB
4Accepted4ms2904 KiB
5Accepted4ms3080 KiB
6Wrong answer4ms3200 KiB
7Accepted3ms3248 KiB
subtask30/15
8Accepted4ms2592 KiB
9Accepted4ms2904 KiB
10Accepted4ms3080 KiB
11Wrong answer4ms3200 KiB
12Accepted3ms3248 KiB
13Accepted4ms3564 KiB
14Accepted4ms3804 KiB
15Accepted4ms3900 KiB
16Accepted4ms3708 KiB
17Accepted4ms3756 KiB
subtask40/35
18Accepted4ms2592 KiB
19Accepted4ms2904 KiB
20Accepted4ms3080 KiB
21Wrong answer4ms3200 KiB
22Accepted3ms3248 KiB
23Accepted4ms3564 KiB
24Accepted4ms3804 KiB
25Accepted4ms3900 KiB
26Accepted4ms3708 KiB
27Accepted4ms3756 KiB
28Accepted4ms3640 KiB
29Accepted56ms9596 KiB
30Accepted82ms10648 KiB
31Accepted82ms10656 KiB
32Wrong answer68ms17788 KiB
subtask50/35
33Accepted4ms2592 KiB
34Accepted4ms2904 KiB
35Accepted4ms3080 KiB
36Wrong answer4ms3200 KiB
37Accepted3ms3248 KiB
38Accepted4ms3564 KiB
39Accepted4ms3804 KiB
40Accepted4ms3900 KiB
41Accepted4ms3708 KiB
42Accepted4ms3756 KiB
43Accepted4ms3640 KiB
44Accepted56ms9596 KiB
45Accepted82ms10648 KiB
46Accepted82ms10656 KiB
47Wrong answer68ms17788 KiB
48Accepted140ms16608 KiB
49Wrong answer291ms29720 KiB
50Accepted291ms29588 KiB
51Accepted291ms29712 KiB
52Accepted289ms29720 KiB