106082024-04-06 14:39:32Valaki2Drónfutárcpp17Hibás válasz 0/100381ms60328 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() {
    //cout << "----------\n";
    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) {
        //cout << cur.idx << ": " << cur.x << " " << cur.y << "\n";
        auto it = m.lower_bound(cur.x - cur.y);
        while(it != m.end()) {
            int other = it->se;
            //cout << other << " ";
            if(x[other] > x[cur.idx]) {
                break;
            }
            it = m.erase(it);
            add(other, cur.idx);
        }
        m[cur.x - cur.y] = cur.idx;
        //cout << "\n";
    }
}

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
1Elfogadva3ms2044 KiB
2Hibás válasz370ms56468 KiB
subtask20/15
3Elfogadva6ms4836 KiB
4Elfogadva6ms4948 KiB
5Hibás válasz4ms5080 KiB
6Elfogadva4ms5224 KiB
7Elfogadva3ms5140 KiB
subtask30/15
8Elfogadva6ms4836 KiB
9Elfogadva6ms4948 KiB
10Hibás válasz4ms5080 KiB
11Elfogadva4ms5224 KiB
12Elfogadva3ms5140 KiB
13Elfogadva4ms5348 KiB
14Elfogadva4ms5500 KiB
15Hibás válasz6ms5760 KiB
16Hibás válasz4ms5988 KiB
17Elfogadva4ms6256 KiB
subtask40/35
18Elfogadva6ms4836 KiB
19Elfogadva6ms4948 KiB
20Hibás válasz4ms5080 KiB
21Elfogadva4ms5224 KiB
22Elfogadva3ms5140 KiB
23Elfogadva4ms5348 KiB
24Elfogadva4ms5500 KiB
25Hibás válasz6ms5760 KiB
26Hibás válasz4ms5988 KiB
27Elfogadva4ms6256 KiB
28Elfogadva4ms6236 KiB
29Hibás válasz71ms18240 KiB
30Hibás válasz104ms20744 KiB
31Elfogadva104ms21412 KiB
32Elfogadva79ms29448 KiB
subtask50/35
33Elfogadva6ms4836 KiB
34Elfogadva6ms4948 KiB
35Hibás válasz4ms5080 KiB
36Elfogadva4ms5224 KiB
37Elfogadva3ms5140 KiB
38Elfogadva4ms5348 KiB
39Elfogadva4ms5500 KiB
40Hibás válasz6ms5760 KiB
41Hibás válasz4ms5988 KiB
42Elfogadva4ms6256 KiB
43Elfogadva4ms6236 KiB
44Hibás válasz71ms18240 KiB
45Hibás válasz104ms20744 KiB
46Elfogadva104ms21412 KiB
47Elfogadva79ms29448 KiB
48Hibás válasz180ms33712 KiB
49Hibás válasz381ms60328 KiB
50Hibás válasz381ms60292 KiB
51Hibás válasz381ms60284 KiB
52Elfogadva379ms60272 KiB