Submission #924729

#TimeUsernameProblemLanguageResultExecution timeMemory
924729CamillusBuilding Skyscrapers (CEOI19_skyscrapers)C++17
54 / 100
576 ms16668 KiB
/// @author Camillus
#include "bits/stdc++.h"

using ll = long long;
using namespace std;

struct dsu {
    vector<int> p;

    dsu() = default;
    dsu(int n) {
        p.resize(n);
        iota(p.begin(), p.end(), 0);
    }

    int get(int x) {
        if (x == p[x]) {
            return x;
        } else {
            return p[x] = get(p[x]);
        }
    }

    void join(int x, int y) {
        x = get(x);
        y = get(y);
        p[x] = y;
    }
};

auto sideN(int x, int y) {
    array<pair<int, int>, 4> result;
    result[0] = pair(x, y - 1);
    result[1] = pair(x, y + 1);
    result[2] = pair(x - 1, y);
    result[3] = pair(x + 1, y);
    return result;
}

auto sideN(const pair<int, int> &pos) {
    return sideN(pos.first, pos.second);
}

auto cornerN(int x, int y) {
    array<pair<int, int>, 8> result;
    // sides
    result[0] = pair(x, y - 1);
    result[1] = pair(x, y + 1);
    result[2] = pair(x - 1, y);
    result[3] = pair(x + 1, y);
    // corners
    result[4] = pair(x + 1, y + 1);
    result[5] = pair(x + 1, y - 1);
    result[6] = pair(x - 1, y + 1);
    result[7] = pair(x - 1, y - 1);
    return result;
}

auto cornerN(const pair<int, int> &pos) {
    return cornerN(pos.first, pos.second);
}

ll dist(const pair<int, int> &first, const pair<int, int> &second) {
    ll x = first.first - second.first;
    ll y = first.second - second.second;
    return x * x + y * y;
}

mt19937 rnd(228);

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, t;
    cin >> n >> t;

    vector<pair<int, int>> a(n);
    map<pair<int, int>, int> b;

    for (int i = 0; i < n; i++) {
        int r, c;
        cin >> r >> c;

        a[i] = pair(r, c);
        b[pair(r, c)] = i;
    }

    dsu D(n);

    for (auto [pos_u, u] : b) {
        for (auto pos_v : cornerN(pos_u)) {
            if (b.count(pos_v)) {
                int v = b[pos_v];
                D.join(u, v);
            }
        }
    }

    for (int u = 0; u < n; u++) {
        if (D.get(u) != D.get(0)) {
            cout << "NO\n";
            return 0;
        }
    }

    cout << "YES\n";

    vector<int> ans;

    int start = rnd() % n;

    vector<bool> used(n);
    set<pair<int, int>> Q; 
    used[start] = true;
    Q.emplace(0, start);

    while (!Q.empty()) {
        int u = Q.begin()->second;
        ans.push_back(u);
        Q.erase(Q.begin());

        auto pos_u = a[u];

        for (auto pos_v : cornerN(pos_u)) {
            if (b.count(pos_v)) {
                int v = b[pos_v];
                if (!used[v]) {
                    used[v] = true;
                    Q.emplace(dist(pos_v, a[start]), v);
                }
            }
        }
    }

    for (int i = 0; i < n; i++) {
        cout << ans[i] + 1 << '\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...