106102024-04-06 14:43:46Valaki2Drónfutárcpp17Időlimit túllépés 15/100601ms29500 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++) {
        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();
    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
1Elfogadva3ms1916 KiB
2Időlimit túllépés601ms27024 KiB
subtask215/15
3Elfogadva8ms3236 KiB
4Elfogadva8ms3688 KiB
5Elfogadva7ms3760 KiB
6Elfogadva8ms3824 KiB
7Elfogadva4ms3632 KiB
subtask30/15
8Elfogadva8ms3236 KiB
9Elfogadva8ms3688 KiB
10Elfogadva7ms3760 KiB
11Elfogadva8ms3824 KiB
12Elfogadva4ms3632 KiB
13Elfogadva4ms3960 KiB
14Elfogadva8ms3880 KiB
15Elfogadva8ms3884 KiB
16Elfogadva8ms4136 KiB
17Elfogadva8ms4276 KiB
subtask40/35
18Elfogadva8ms3236 KiB
19Elfogadva8ms3688 KiB
20Elfogadva7ms3760 KiB
21Elfogadva8ms3824 KiB
22Elfogadva4ms3632 KiB
23Elfogadva4ms3960 KiB
24Elfogadva8ms3880 KiB
25Elfogadva8ms3884 KiB
26Elfogadva8ms4136 KiB
27Elfogadva8ms4276 KiB
28Elfogadva8ms4160 KiB
29Elfogadva119ms12656 KiB
30Elfogadva181ms17112 KiB
31Elfogadva181ms17300 KiB
32Elfogadva133ms22764 KiB
subtask50/35
33Elfogadva8ms3236 KiB
34Elfogadva8ms3688 KiB
35Elfogadva7ms3760 KiB
36Elfogadva8ms3824 KiB
37Elfogadva4ms3632 KiB
38Elfogadva4ms3960 KiB
39Elfogadva8ms3880 KiB
40Elfogadva8ms3884 KiB
41Elfogadva8ms4136 KiB
42Elfogadva8ms4276 KiB
43Elfogadva8ms4160 KiB
44Elfogadva119ms12656 KiB
45Elfogadva181ms17112 KiB
46Elfogadva181ms17300 KiB
47Elfogadva133ms22764 KiB
48Elfogadva314ms29500 KiB
49Időlimit túllépés544ms18956 KiB
50Időlimit túllépés566ms29048 KiB
51Időlimit túllépés563ms28964 KiB
52Időlimit túllépés583ms29020 KiB