106032024-04-06 14:24:33Valaki2Drónfutárcpp17Hibás válasz 0/100293ms60448 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() {
    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.y - cur.x);
        while(it != m.end()) {
            int other = it->se;
            it = m.erase(it);
            if(x[other] > x[cur.idx]) {
                break;
            }
            add(other, cur.idx);
        }
        m[cur.y - cur.x] = 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();
    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
1Elfogadva3ms2048 KiB
2Hibás válasz284ms56408 KiB
subtask20/15
3Hibás válasz4ms4680 KiB
4Hibás válasz4ms4924 KiB
5Hibás válasz4ms5104 KiB
6Hibás válasz4ms5360 KiB
7Elfogadva3ms5040 KiB
subtask30/15
8Hibás válasz4ms4680 KiB
9Hibás válasz4ms4924 KiB
10Hibás válasz4ms5104 KiB
11Hibás válasz4ms5360 KiB
12Elfogadva3ms5040 KiB
13Elfogadva4ms5380 KiB
14Hibás válasz4ms5656 KiB
15Hibás válasz4ms5884 KiB
16Hibás válasz4ms6008 KiB
17Hibás válasz4ms6040 KiB
subtask40/35
18Hibás válasz4ms4680 KiB
19Hibás válasz4ms4924 KiB
20Hibás válasz4ms5104 KiB
21Hibás válasz4ms5360 KiB
22Elfogadva3ms5040 KiB
23Elfogadva4ms5380 KiB
24Hibás válasz4ms5656 KiB
25Hibás válasz4ms5884 KiB
26Hibás válasz4ms6008 KiB
27Hibás válasz4ms6040 KiB
28Hibás válasz4ms6084 KiB
29Hibás válasz56ms18172 KiB
30Hibás válasz79ms20932 KiB
31Hibás válasz79ms21336 KiB
32Elfogadva61ms25264 KiB
subtask50/35
33Hibás válasz4ms4680 KiB
34Hibás válasz4ms4924 KiB
35Hibás válasz4ms5104 KiB
36Hibás válasz4ms5360 KiB
37Elfogadva3ms5040 KiB
38Elfogadva4ms5380 KiB
39Hibás válasz4ms5656 KiB
40Hibás válasz4ms5884 KiB
41Hibás válasz4ms6008 KiB
42Hibás válasz4ms6040 KiB
43Hibás válasz4ms6084 KiB
44Hibás válasz56ms18172 KiB
45Hibás válasz79ms20932 KiB
46Hibás válasz79ms21336 KiB
47Elfogadva61ms25264 KiB
48Hibás válasz136ms34812 KiB
49Hibás válasz287ms60440 KiB
50Hibás válasz293ms60448 KiB
51Hibás válasz287ms60448 KiB
52Hibás válasz286ms60448 KiB