Submission #921298

#TimeUsernameProblemLanguageResultExecution timeMemory
921298ErJPastiri (COI20_pastiri)C++17
100 / 100
652 ms66904 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define vi vector<ll>
#define vvi vector<vector<ll>>
#define vs vector<string>
#define vc vector<char>
#define vb vector<bool>
#define vp vector<pair<ll, ll>>
#define pp pair<ll, ll>
#define qi queue<ll>
#define qp queue<pp>
#define pqi priority_queue<ll>
#define pqp priority_queue<pp>
#define mi map<ll, ll>
#define mpi map<pp, ll>
#define mip map<ll, pp>
#define mpp map<pp, pp>
#define mb map<ll, bool>
#define si set<ll>
#define sp set<pp>
#define mod 1000000007
#define rep(a, b) for(int a = 0; a < (b); a++)
#define inf 1000000000000000000

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, k;
    cin >> n >> k;
    vvi edges(n);
    
    vi sheeps(n), dead(n), dist(n), straznik(n);
    rep(i, n) {
        sheeps[i] = -1;
        dead[i] = 0;
        dist[i] = inf;
        straznik[i] = -1;
    }
    for (int i = 0; i < n - 1; i++) {
        ll u, v;
        cin >> u >> v;
        u--; v--;
        edges[u].push_back(v);
        edges[v].push_back(u);
    }
    qp q;
    for (int i = 0; i < k; i++) {
        int a;
        cin >> a;
        a--;
        sheeps[a] = 0;
        dist[a] = 0;
        q.push({ a, 0 });
    }
    if (n == 1) {
        cout << 1 << endl;
        cout << 1 << endl;
    }
    while (!q.empty()) {
        ll u = q.front().first;
        ll d1 = q.front().second;
        q.pop();
        for (int v : edges[u]) {
            if (dist[v] == inf) {
                dist[v] = d1 + 1;
                q.push({ v, d1 + 1 });
            }
        }
    }
    ll ans = 0;
    vi deg(n);
    queue<ll> q1;
    rep(i, n) {
        deg[i] = edges[i].size();
        if (deg[i] == 1) {
            q1.push(i);
        }
    }
    vi ANS;
    while (!q1.empty()) {
        int u = q1.front();
        
        q1.pop();
        int parent = -2;
        for (int i = 0; i < edges[u].size(); i++) {
            if (dead[edges[u][i]] == 0) {
                parent = edges[u][i];
                break;
            }
        }
        if (parent == -2) {
            if ((sheeps[u] > -1)) {
                if (straznik[u] >= sheeps[u]) {
                    break;
                }
                ans++;
                ANS.push_back(u);
            }
            break;
        }
        if (straznik[u] == -1) { //not straznik
            if (sheeps[u] >= 0) { //is ovce
                if (sheeps[u] + 1 <= dist[parent]) {
                    sheeps[parent] = sheeps[u] + 1;
                    sheeps[u] = -1;
                }
                else {
                    ans++;
                    straznik[u] = sheeps[u];
                    sheeps[u] = -1;
                    ANS.push_back(u);
                    straznik[parent] = max(straznik[parent], straznik[u] - 1);
                    straznik[u] = -1;
                    // move straznika
                }
            }
            else { //not sheep
                dead[u] = 1; //nic tam neni - prohlasim za mrtveho.
            }
        }
        else { // je tu straznik
            if (straznik[u] >= sheeps[u]) {//strazim ovci
                sheeps[u] = -1;
            }
            if (sheeps[u] == -1) {
                if (straznik[u] >= 1) {
                    straznik[parent] = max(straznik[parent], straznik[u] - 1);
                    straznik[u] = -1;
                }
            }
            else {// there is sheep
                //both up
                if (sheeps[u] + 1 <= dist[parent]) { //sheep can go up.
                    straznik[parent] = max(straznik[parent], straznik[u] - 1);
                    sheeps[parent] = sheeps[u] + 1;
                    sheeps[u] = -1;
                }
                else { //sheep cant go up
                    straznik[u] = sheeps[u];
                    ans++;
                    sheeps[u] = -1;
                    straznik[parent] = max(straznik[parent], straznik[u] - 1);
                    straznik[u] = -1;
                    ANS.push_back(u);
                }
            }
        }
        dead[u] = 1;
        deg[parent]--;
        if (deg[parent] <= 1) {
            q1.push(parent);
        }
    }
    cout << ans << endl;
    for (int i = 0; i < ANS.size() - 1; i++) {
        cout << ANS[i] + 1 << " ";
    }
    cout << ANS[ANS.size() - 1] + 1 << endl;
}

Compilation message (stderr)

pastiri.cpp: In function 'int main()':
pastiri.cpp:87:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |         for (int i = 0; i < edges[u].size(); i++) {
      |                         ~~^~~~~~~~~~~~~~~~~
pastiri.cpp:157:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  157 |     for (int i = 0; i < ANS.size() - 1; i++) {
      |                     ~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...