106132024-04-06 15:17:49Valaki2Drónfutárcpp17Hibás válasz 0/100354ms30288 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();
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1908 KiB
2Elfogadva349ms28308 KiB
subtask20/15
3Elfogadva4ms2740 KiB
4Elfogadva4ms2700 KiB
5Elfogadva4ms2700 KiB
6Hibás válasz4ms2956 KiB
7Elfogadva3ms2980 KiB
subtask30/15
8Elfogadva4ms2740 KiB
9Elfogadva4ms2700 KiB
10Elfogadva4ms2700 KiB
11Hibás válasz4ms2956 KiB
12Elfogadva3ms2980 KiB
13Elfogadva4ms3104 KiB
14Elfogadva4ms3240 KiB
15Elfogadva4ms3164 KiB
16Elfogadva4ms3164 KiB
17Elfogadva4ms3572 KiB
subtask40/35
18Elfogadva4ms2740 KiB
19Elfogadva4ms2700 KiB
20Elfogadva4ms2700 KiB
21Hibás válasz4ms2956 KiB
22Elfogadva3ms2980 KiB
23Elfogadva4ms3104 KiB
24Elfogadva4ms3240 KiB
25Elfogadva4ms3164 KiB
26Elfogadva4ms3164 KiB
27Elfogadva4ms3572 KiB
28Elfogadva4ms3420 KiB
29Elfogadva67ms9308 KiB
30Elfogadva98ms10520 KiB
31Elfogadva100ms10796 KiB
32Hibás válasz76ms14732 KiB
subtask50/35
33Elfogadva4ms2740 KiB
34Elfogadva4ms2700 KiB
35Elfogadva4ms2700 KiB
36Hibás válasz4ms2956 KiB
37Elfogadva3ms2980 KiB
38Elfogadva4ms3104 KiB
39Elfogadva4ms3240 KiB
40Elfogadva4ms3164 KiB
41Elfogadva4ms3164 KiB
42Elfogadva4ms3572 KiB
43Elfogadva4ms3420 KiB
44Elfogadva67ms9308 KiB
45Elfogadva98ms10520 KiB
46Elfogadva100ms10796 KiB
47Hibás válasz76ms14732 KiB
48Elfogadva170ms17164 KiB
49Hibás válasz354ms30052 KiB
50Elfogadva354ms29920 KiB
51Elfogadva354ms30060 KiB
52Elfogadva354ms30288 KiB