Submission #1245228

#TimeUsernameProblemLanguageResultExecution timeMemory
1245228Mousa_AboubakerBuilding Skyscrapers (CEOI19_skyscrapers)C++20
8 / 100
428 ms10136 KiB
#include <bits/stdc++.h>
using namespace std;

template <typename T>
using pqg = priority_queue<T, vector<T>, greater<T>>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    int t;
    cin >> t;
    vector<pair<int, int>> a(n);
    for(auto &[f, s]: a)
        cin >> f >> s;
    map<pair<int, int>, int> mp;
    vector<bool> vis(n, false);
    for(int i = 0; i < n; i++)
    {
        auto [x, y] = a[i];
        mp[{x, y}] = i;
    }
    vector<int> cnt(n, 0);
    auto get = [&](int x, int y) -> int
    {
        if(mp.find({x, y}) == mp.end())
            return -1;
        int i = mp[{x, y}];
        return i;
    };
    for(int i= 0; i < n; i++)
    {
        auto [x, y] = a[i];
        for(int j = x - 1; j <= x + 1; j++)
            for(int k = y - 1; k <= y + 1; k++)
            {
                int d = get(j, k);
                if(d == -1)
                    continue;
                cnt[i]++;
            }
    }
    vector<int> ord(n);
    iota(ord.begin(), ord.end(), 0);
    sort(ord.begin(), ord.end(), [&](int l, int r)
    {
        if(cnt[l] == cnt[r])
            return a[l].first < a[r].first;
        return cnt[l] > cnt[r];
    });
    priority_queue<tuple<int, int, int, int>> q;
    q.push({cnt[ord[0]], ord[0], a[ord[0]].first, a[ord[0]].second});
    vector<int> res;
    while(!q.empty())
    {
        auto [cost, i, x, y]= q.top();
        q.pop();

        if(vis[i])
            continue;
        res.push_back(i);
        vis[i] = true;
        for(int j = x - 1; j <= x + 1; j++)
            for(int k = y - 1; k <= y + 1; k++)
            {
                int d = get(j, k);
                if(d == -1)
                    continue;
                q.push({cnt[d], d, j, k});
            }
    }

    // for(int i = 0; i < n; i++)
    //     cout << vis[i] << ' ';
    // cout << '\n';

    bool can = count(vis.begin(), vis.end(), true) == n;
    if(!can)
    {
        cout << "NO";
        return 0;
    }

    // shuffle(res.begin(), res.end(), rng);

    cout << "YES\n";
    for(auto i: res)
        cout << i + 1 << '\n';
}
#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...