5560 2023. 07. 27 11:18:24 zsombor Drónfutár cpp17 Elfogadva 100/100 266ms 20892 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
using namespace std;

struct point{
    int x,y,ind;
};

int n;
vector <point> v;
vector <pair <int,pair <int,int>>> e;
map <int,int> m;

bool srt(point a,point b){
    return (a.x+a.y<b.x+b.y);
}

int dist(int i,int j){
    int a=abs((v[i].x+v[i].y)-(v[j].x+v[j].y));
    int b=abs((v[i].x-v[i].y)-(v[j].x-v[j].y));
    return max(a,b);
}

void get_edges(){
    sort(v.begin(),v.end(),srt);
    m.clear();
    for (int i=0;i<n;i++){
        auto it=m.lower_bound(v[i].x-v[i].y);
        while(it!=m.end()){
            int j=(*it).second;
            if (v[j].x>v[i].x) break;
            it=m.erase(it);
            pair <int,pair<int,int>>p;
            p.first=dist(i,j);
            p.second.first=min(v[i].ind,v[j].ind);
            p.second.second=max(v[i].ind,v[j].ind);
            e.push_back(p);
        }
        m[v[i].x-v[i].y]=i;
    }
}

void geometry(){
    get_edges();
    for (int i=0;i<n;i++) v[i].y*=-1;
    get_edges();
    for (int i=0;i<n;i++) swap(v[i].x,v[i].y);
    get_edges();
    for (int i=0;i<n;i++) v[i].y*=-1;
    get_edges();
}

//------------------------------

int cnt;
vector <int> par(1e5,0);
vector <int> sz(1e5,1);

int holvan(int a){
    return (a==par[a]?a:par[a]=holvan(par[a]));
}

void unio(int a,int b){
    a=holvan(a);
    b=holvan(b);
    if (a==b) return;
    if (sz[a]>sz[b]) swap(a,b);
    par[a]=b;
    sz[b]+=sz[a];
    cnt--;
}

int spanning_tree(){
    cnt=n;
    for (int i=0;i<n;i++) par[i]=i;
    sort(e.begin(),e.end());
    int a,b,w;
    for (auto p : e){
        a=p.second.first;
        b=p.second.second;
        w=p.first;
        unio(a,b);
        if (cnt==1) return w;
    }
    return -1;
}

//------------------------------

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    v.resize(n);
    for (int i=0;i<n;i++){
        cin >> v[i].x >> v[i].y;
        v[i].ind=i;
    }
    geometry();
    cout << spanning_tree();
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 3160 KiB
2 Elfogadva 263ms 18492 KiB
subtask2 15/15
3 Elfogadva 4ms 4136 KiB
4 Elfogadva 4ms 4224 KiB
5 Elfogadva 4ms 4448 KiB
6 Elfogadva 4ms 4524 KiB
7 Elfogadva 3ms 4352 KiB
subtask3 15/15
8 Elfogadva 4ms 4136 KiB
9 Elfogadva 4ms 4224 KiB
10 Elfogadva 4ms 4448 KiB
11 Elfogadva 4ms 4524 KiB
12 Elfogadva 3ms 4352 KiB
13 Elfogadva 4ms 4436 KiB
14 Elfogadva 4ms 4816 KiB
15 Elfogadva 4ms 5052 KiB
16 Elfogadva 4ms 5136 KiB
17 Elfogadva 4ms 5184 KiB
subtask4 35/35
18 Elfogadva 4ms 4136 KiB
19 Elfogadva 4ms 4224 KiB
20 Elfogadva 4ms 4448 KiB
21 Elfogadva 4ms 4524 KiB
22 Elfogadva 3ms 4352 KiB
23 Elfogadva 4ms 4436 KiB
24 Elfogadva 4ms 4816 KiB
25 Elfogadva 4ms 5052 KiB
26 Elfogadva 4ms 5136 KiB
27 Elfogadva 4ms 5184 KiB
28 Elfogadva 4ms 5160 KiB
29 Elfogadva 50ms 8612 KiB
30 Elfogadva 75ms 9016 KiB
31 Elfogadva 75ms 9356 KiB
32 Elfogadva 63ms 11120 KiB
subtask5 35/35
33 Elfogadva 4ms 4136 KiB
34 Elfogadva 4ms 4224 KiB
35 Elfogadva 4ms 4448 KiB
36 Elfogadva 4ms 4524 KiB
37 Elfogadva 3ms 4352 KiB
38 Elfogadva 4ms 4436 KiB
39 Elfogadva 4ms 4816 KiB
40 Elfogadva 4ms 5052 KiB
41 Elfogadva 4ms 5136 KiB
42 Elfogadva 4ms 5184 KiB
43 Elfogadva 4ms 5160 KiB
44 Elfogadva 50ms 8612 KiB
45 Elfogadva 75ms 9016 KiB
46 Elfogadva 75ms 9356 KiB
47 Elfogadva 63ms 11120 KiB
48 Elfogadva 128ms 12780 KiB
49 Elfogadva 266ms 20344 KiB
50 Elfogadva 266ms 20668 KiB
51 Elfogadva 266ms 20868 KiB
52 Elfogadva 266ms 20892 KiB