106052024-04-06 14:29:27Valaki2Drónfutárcpp17Hibás válasz 0/100301ms60444 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;
            if(x[other] > x[cur.idx]) {
                break;
            }
            it = m.erase(it);
            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
1Elfogadva3ms1916 KiB
2Hibás válasz287ms56420 KiB
subtask20/15
3Hibás válasz4ms4644 KiB
4Hibás válasz4ms4868 KiB
5Hibás válasz4ms5052 KiB
6Hibás válasz4ms5252 KiB
7Elfogadva3ms5008 KiB
subtask30/15
8Hibás válasz4ms4644 KiB
9Hibás válasz4ms4868 KiB
10Hibás válasz4ms5052 KiB
11Hibás válasz4ms5252 KiB
12Elfogadva3ms5008 KiB
13Elfogadva4ms5436 KiB
14Hibás válasz4ms5788 KiB
15Hibás válasz4ms5880 KiB
16Hibás válasz4ms6028 KiB
17Hibás válasz4ms6128 KiB
subtask40/35
18Hibás válasz4ms4644 KiB
19Hibás válasz4ms4868 KiB
20Hibás válasz4ms5052 KiB
21Hibás válasz4ms5252 KiB
22Elfogadva3ms5008 KiB
23Elfogadva4ms5436 KiB
24Hibás válasz4ms5788 KiB
25Hibás válasz4ms5880 KiB
26Hibás válasz4ms6028 KiB
27Hibás válasz4ms6128 KiB
28Hibás válasz4ms6152 KiB
29Hibás válasz57ms18016 KiB
30Hibás válasz82ms20384 KiB
31Hibás válasz82ms20900 KiB
32Elfogadva64ms24812 KiB
subtask50/35
33Hibás válasz4ms4644 KiB
34Hibás válasz4ms4868 KiB
35Hibás válasz4ms5052 KiB
36Hibás válasz4ms5252 KiB
37Elfogadva3ms5008 KiB
38Elfogadva4ms5436 KiB
39Hibás válasz4ms5788 KiB
40Hibás válasz4ms5880 KiB
41Hibás válasz4ms6028 KiB
42Hibás válasz4ms6128 KiB
43Hibás válasz4ms6152 KiB
44Hibás válasz57ms18016 KiB
45Hibás válasz82ms20384 KiB
46Hibás válasz82ms20900 KiB
47Elfogadva64ms24812 KiB
48Hibás válasz143ms34168 KiB
49Hibás válasz289ms60440 KiB
50Hibás válasz300ms60444 KiB
51Hibás válasz301ms60444 KiB
52Hibás válasz298ms60344 KiB