106162024-04-06 15:21:33Valaki2Drónfutárcpp17Elfogadva 100/100282ms30400 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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1980 KiB
2Elfogadva282ms28212 KiB
subtask215/15
3Elfogadva4ms2680 KiB
4Elfogadva4ms2892 KiB
5Elfogadva4ms3108 KiB
6Elfogadva4ms3348 KiB
7Elfogadva3ms3460 KiB
subtask315/15
8Elfogadva4ms2680 KiB
9Elfogadva4ms2892 KiB
10Elfogadva4ms3108 KiB
11Elfogadva4ms3348 KiB
12Elfogadva3ms3460 KiB
13Elfogadva4ms3592 KiB
14Elfogadva4ms3764 KiB
15Elfogadva4ms3816 KiB
16Elfogadva4ms3816 KiB
17Elfogadva4ms3816 KiB
subtask435/35
18Elfogadva4ms2680 KiB
19Elfogadva4ms2892 KiB
20Elfogadva4ms3108 KiB
21Elfogadva4ms3348 KiB
22Elfogadva3ms3460 KiB
23Elfogadva4ms3592 KiB
24Elfogadva4ms3764 KiB
25Elfogadva4ms3816 KiB
26Elfogadva4ms3816 KiB
27Elfogadva4ms3816 KiB
28Elfogadva4ms4076 KiB
29Elfogadva54ms9640 KiB
30Elfogadva78ms10932 KiB
31Elfogadva79ms11144 KiB
32Elfogadva57ms14964 KiB
subtask535/35
33Elfogadva4ms2680 KiB
34Elfogadva4ms2892 KiB
35Elfogadva4ms3108 KiB
36Elfogadva4ms3348 KiB
37Elfogadva3ms3460 KiB
38Elfogadva4ms3592 KiB
39Elfogadva4ms3764 KiB
40Elfogadva4ms3816 KiB
41Elfogadva4ms3816 KiB
42Elfogadva4ms3816 KiB
43Elfogadva4ms4076 KiB
44Elfogadva54ms9640 KiB
45Elfogadva78ms10932 KiB
46Elfogadva79ms11144 KiB
47Elfogadva57ms14964 KiB
48Elfogadva134ms17164 KiB
49Elfogadva277ms30260 KiB
50Elfogadva277ms30256 KiB
51Elfogadva277ms30256 KiB
52Elfogadva275ms30400 KiB