106152024-04-06 15:20:48Valaki2Drónfutárcpp17Hibás válasz 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();
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1844 KiB
2Elfogadva293ms28248 KiB
subtask20/15
3Elfogadva4ms2592 KiB
4Elfogadva4ms2904 KiB
5Elfogadva4ms3080 KiB
6Hibás válasz4ms3200 KiB
7Elfogadva3ms3248 KiB
subtask30/15
8Elfogadva4ms2592 KiB
9Elfogadva4ms2904 KiB
10Elfogadva4ms3080 KiB
11Hibás válasz4ms3200 KiB
12Elfogadva3ms3248 KiB
13Elfogadva4ms3564 KiB
14Elfogadva4ms3804 KiB
15Elfogadva4ms3900 KiB
16Elfogadva4ms3708 KiB
17Elfogadva4ms3756 KiB
subtask40/35
18Elfogadva4ms2592 KiB
19Elfogadva4ms2904 KiB
20Elfogadva4ms3080 KiB
21Hibás válasz4ms3200 KiB
22Elfogadva3ms3248 KiB
23Elfogadva4ms3564 KiB
24Elfogadva4ms3804 KiB
25Elfogadva4ms3900 KiB
26Elfogadva4ms3708 KiB
27Elfogadva4ms3756 KiB
28Elfogadva4ms3640 KiB
29Elfogadva56ms9596 KiB
30Elfogadva82ms10648 KiB
31Elfogadva82ms10656 KiB
32Hibás válasz68ms17788 KiB
subtask50/35
33Elfogadva4ms2592 KiB
34Elfogadva4ms2904 KiB
35Elfogadva4ms3080 KiB
36Hibás válasz4ms3200 KiB
37Elfogadva3ms3248 KiB
38Elfogadva4ms3564 KiB
39Elfogadva4ms3804 KiB
40Elfogadva4ms3900 KiB
41Elfogadva4ms3708 KiB
42Elfogadva4ms3756 KiB
43Elfogadva4ms3640 KiB
44Elfogadva56ms9596 KiB
45Elfogadva82ms10648 KiB
46Elfogadva82ms10656 KiB
47Hibás válasz68ms17788 KiB
48Elfogadva140ms16608 KiB
49Hibás válasz291ms29720 KiB
50Elfogadva291ms29588 KiB
51Elfogadva291ms29712 KiB
52Elfogadva289ms29720 KiB