106082024-04-06 14:39:32Valaki2Drónfutárcpp17Wrong answer 0/100381ms60328 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() {
    //cout << "----------\n";
    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) {
        //cout << cur.idx << ": " << cur.x << " " << cur.y << "\n";
        auto it = m.lower_bound(cur.x - cur.y);
        while(it != m.end()) {
            int other = it->se;
            //cout << other << " ";
            if(x[other] > x[cur.idx]) {
                break;
            }
            it = m.erase(it);
            add(other, cur.idx);
        }
        m[cur.x - cur.y] = cur.idx;
        //cout << "\n";
    }
}

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();
    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
1Accepted3ms2044 KiB
2Wrong answer370ms56468 KiB
subtask20/15
3Accepted6ms4836 KiB
4Accepted6ms4948 KiB
5Wrong answer4ms5080 KiB
6Accepted4ms5224 KiB
7Accepted3ms5140 KiB
subtask30/15
8Accepted6ms4836 KiB
9Accepted6ms4948 KiB
10Wrong answer4ms5080 KiB
11Accepted4ms5224 KiB
12Accepted3ms5140 KiB
13Accepted4ms5348 KiB
14Accepted4ms5500 KiB
15Wrong answer6ms5760 KiB
16Wrong answer4ms5988 KiB
17Accepted4ms6256 KiB
subtask40/35
18Accepted6ms4836 KiB
19Accepted6ms4948 KiB
20Wrong answer4ms5080 KiB
21Accepted4ms5224 KiB
22Accepted3ms5140 KiB
23Accepted4ms5348 KiB
24Accepted4ms5500 KiB
25Wrong answer6ms5760 KiB
26Wrong answer4ms5988 KiB
27Accepted4ms6256 KiB
28Accepted4ms6236 KiB
29Wrong answer71ms18240 KiB
30Wrong answer104ms20744 KiB
31Accepted104ms21412 KiB
32Accepted79ms29448 KiB
subtask50/35
33Accepted6ms4836 KiB
34Accepted6ms4948 KiB
35Wrong answer4ms5080 KiB
36Accepted4ms5224 KiB
37Accepted3ms5140 KiB
38Accepted4ms5348 KiB
39Accepted4ms5500 KiB
40Wrong answer6ms5760 KiB
41Wrong answer4ms5988 KiB
42Accepted4ms6256 KiB
43Accepted4ms6236 KiB
44Wrong answer71ms18240 KiB
45Wrong answer104ms20744 KiB
46Accepted104ms21412 KiB
47Accepted79ms29448 KiB
48Wrong answer180ms33712 KiB
49Wrong answer381ms60328 KiB
50Wrong answer381ms60292 KiB
51Wrong answer381ms60284 KiB
52Accepted379ms60272 KiB