56862023-09-08 00:13:41TuruTamasMobilNet (50 pont)cpp17Hibás válasz 0/5023ms6464 KiB
//
// Created by tamas on 9/7/23.
//

// sztem kicsit ronda, de hát na

#include "bits/stdc++.h"
#include "pthread.h"
#include "semaphore.h"
using namespace std;

#define InTheNameOfGod ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);
#define ull unsigned long long

int N;
ull top, bot, T;

typedef pair<ull, ull> coord;

vector<coord> by_x;
vector<coord> by_y;
map<coord, bool> visited;

auto sort_by_x = [](coord a, coord b) {
    if (a.first == b.first)
        return a.second > b.second;
    return a.first < b.first;
};

auto sort_by_y = [](coord a, coord b) {
    if (a.second == b.second)
        return a.first > b.first;
    return a.second > b.second;
};

void dfs(coord& x) {
//    cout << "in " << x.first << " " << x.second << "\n";
    visited[x] = true;
    long ind = std::lower_bound(by_x.begin(), by_x.end(), x, sort_by_x) - by_x.begin();
    long i = ind-1;
    while (i >= 0 && by_x[i].first == x.first && by_x[i].second - x.second <= T) {
        if (!visited[by_x[i]]) {
            dfs(by_x[i]);
        }
        i--;
    }
    i = ind+1;
    while (i < N && by_x[i].first == x.first && x.second - by_x[i].second <= T) {
        if (!visited[by_x[i]]) {
            dfs(by_x[i]);
        }
        i++;
    }

    ind = std::lower_bound(by_y.begin(), by_y.end(), x, sort_by_y) - by_y.begin();
    i = ind-1;
    while (i >= 0 && by_y[i].second == x.second && by_y[i].first - x.first <= T) {
        if (!visited[by_y[i]]) {
            dfs(by_y[i]);
        }
        i++;
    }
    i = ind+1;
    while (i < N && by_y[i].second == x.second && x.first - by_y[i].first <= T ) {
        if (!visited[by_y[i]]) {
            dfs(by_y[i]);
        }
        i--;
    }
}

inline bool good() {
    for (auto& kv : visited) {
        kv.second = false;
    }
//    cout << "T=" << T << ":\n";
    dfs(by_x[0]);
    bool r = true;
    for (auto p : visited)
        if (!p.second)
            r = false;
    return r;
}

inline int gut() {
    for (auto& kv : visited) {
        kv.second = false;
    }
//    cout << "T=" << T << ":\n";
    int r = -1;
    T--;
    for (auto p : visited)
        if (!p.second) {
            r++;
            dfs((coord &) p.first);
        }
    T++;
    return r;
}

sem_t sem;

void f(coord *in) {
    int ind = 0;
    while (true) {
        sem_wait(&sem);
        ull x = in[ind].first-1;
        ull y = in[ind].second-1;
        visited.emplace(make_pair(x, y), false);
        by_x.emplace_back(x, y);
        by_y.emplace_back(x, y);
        if (++ind == N)
            return;
    }
}

int main() {
    InTheNameOfGod
    cin >> N;
    by_y.reserve(N);
    by_x.reserve(N);
    sem_init(&sem, 0, 0);
    coord in[N];
    pthread_t thr;
    pthread_create(&thr, nullptr, (void* (*)(void *))(f), in);
    for (int i = 0; i < N; i++) {
        ull x, y;
        cin >> in[i].first >> in[i].second;
        sem_post(&sem);
    }
    pthread_join(thr, nullptr);
    sem_destroy(&sem);
    std::sort(by_y.begin(), by_y.end(), sort_by_y);
    std::sort(by_x.begin(), by_x.end(), sort_by_x);
    bot = 1;
    top = 10'000'001;
    T = (top/N);
    while (bot <= top) {
        if (good())
            top = T - 1;
        else
            bot = T + 1;
        T = (bot + top) / 2;
    }
    T++; // idk miért
    cout << T << "\n" << gut();
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base0/50
1Hibás válasz0/03ms2028 KiB
2Hibás válasz0/04ms2560 KiB
3Hibás válasz0/23ms2596 KiB
4Hibás válasz0/23ms2840 KiB
5Hibás válasz0/23ms3076 KiB
6Hibás válasz0/23ms3332 KiB
7Hibás válasz0/23ms3580 KiB
8Hibás válasz0/23ms3832 KiB
9Hibás válasz0/23ms4088 KiB
10Hibás válasz0/24ms4140 KiB
11Hibás válasz0/24ms4432 KiB
12Hibás válasz0/24ms4548 KiB
13Hibás válasz0/37ms4672 KiB
14Hibás válasz0/38ms4892 KiB
15Hibás válasz0/310ms5376 KiB
16Hibás válasz0/312ms5536 KiB
17Hibás válasz0/316ms5768 KiB
18Hibás válasz0/316ms5936 KiB
19Hibás válasz0/317ms6032 KiB
20Hibás válasz0/321ms6348 KiB
21Hibás válasz0/323ms6324 KiB
22Hibás válasz0/321ms6464 KiB