Submission #593506

# Submission time Handle Problem Language Result Execution time Memory
593506 2022-07-11T09:56:27 Z alextodoran Mousetrap (CEOI17_mousetrap) C++17
25 / 100
709 ms 81136 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;

    for (int i = 1; i <= len; 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), i));
            }
        }
        if (s.empty() == false) {
            multiset <pair <int, int>> :: iterator it = prev(s.end());
            block[it->second]++;
            s.erase(it);
        }
        maxDown[i] = (s.empty() == false ? prev(s.end())->first : 0);
    }

    int answer = 0;
    int aux = 0;
    for (int i = 1; i <= len; i++) {
        answer = max(answer, maxDown[i]);
        aux += block[i];
    }
    cout << answer << "\n";

    return 0;
}
# Verdict Execution time Memory Grader output
1 Incorrect 12 ms 23764 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 269 ms 66948 KB Output is correct
2 Correct 259 ms 62580 KB Output is correct
3 Correct 668 ms 68084 KB Output is correct
4 Correct 302 ms 46080 KB Output is correct
5 Correct 641 ms 68076 KB Output is correct
6 Correct 709 ms 81136 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 12 ms 23764 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 12 ms 23764 KB Output isn't correct
2 Halted 0 ms 0 KB -