Submission #593545

# Submission time Handle Problem Language Result Execution time Memory
593545 2022-07-11T11:23:23 Z alextodoran Mousetrap (CEOI17_mousetrap) C++17
25 / 100
1087 ms 68584 KB
/**
 ____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|

**/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N_MAX = (int) 1e6;

int N, T, M;
vector <int> adj[N_MAX + 2];

int parent[N_MAX + 2];
int up[N_MAX + 2];
int down[N_MAX + 2];

void dfs (int u) {
    int sons = (int) adj[u].size() - (u != T);
    int max1 = 0, max2 = 0;
    for (int v : adj[u]) {
        if (v != parent[u]) {
            parent[v] = u;
            up[v] = up[u] + sons;
            dfs(v);
            if (down[v] >= max1) {
                max2 = max1;
                max1 = down[v];
            } else if (down[v] > max2) {
                max2 = down[v];
            }
        }
    }
    if (sons == 0) {
        down[u] = up[u];
    } else if (sons == 1) {
        down[u] = up[u] + 1;
    } else {
        down[u] = max2;
    }
}

int path[N_MAX + 2];
int len;

multiset <pair <int, int>> s;
int maxDown[N_MAX + 2];
int block[N_MAX + 2];

int main () {
//    ios_base::sync_with_stdio(false);
//    cin.tie(0);
//    cout.tie(0);

    cin >> N >> T >> M;
    for (int i = 1; i <= N - 1; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    dfs(T);

    int u = M;
    while (u != T) {
        path[++len] = u;
        u = parent[u];
    }
    path[++len] = T;

    int lazy = 0;
    for (int i = len; i >= 1; i--) {
        int u = path[i];
        for (int v : adj[u]) {
            if (v != parent[u] && v != path[i - 1]) {
                s.insert(make_pair(down[v] - (len - i) - lazy, i));
            }
        }
        if (s.empty() == false) {
            multiset <pair <int, int>> :: iterator it = prev(s.end());
            int d, j; tie(d, j) = *it;
            if (j != i || d > maxDown[i + 1] + 1) {
                if (j == i) {
                    for (int v : adj[u]) {
                        if (v != parent[u] && v != path[i - 1]) {
                            s.erase(s.find(make_pair(down[v] - (len - i) - lazy, i)));
                            s.insert(make_pair(down[v] - (len - i) - (lazy + 1), i));
                        }
                    }
                    lazy++;
                }
                block[j]++;
                s.erase(s.find(make_pair(d - (i == j), j)));
            }
        }
        maxDown[i] = (s.empty() == false ? prev(s.end())->first : 0) + lazy;
    }
    int answer = 0, useless = 0;
    for (int i = 1; i <= len; i++){
        answer = max(answer, maxDown[i]);
        useless += block[i];
    }
    cout << answer << "\n";

    return 0;
}
# Verdict Execution time Memory Grader output
1 Incorrect 13 ms 23764 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 667 ms 67452 KB Output is correct
2 Correct 622 ms 63148 KB Output is correct
3 Correct 1053 ms 68584 KB Output is correct
4 Correct 503 ms 46472 KB Output is correct
5 Correct 1049 ms 68500 KB Output is correct
6 Correct 1087 ms 68556 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 13 ms 23764 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 13 ms 23764 KB Output isn't correct
2 Halted 0 ms 0 KB -