7253 2024. 01. 05 14:53:08 anon Tom és Jerry 3 cpp17 Elfogadva 50/50 144ms 19932 KiB
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define FastIO ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
using namespace std;
typedef long long ll;
typedef struct {
    ll md;
    ll depth;
    ll parent;
    vector<ll> children;
} Branch;
ll build_tree(ll vertex, ll parent, ll depth, vector<Branch> &tree, const vector<vector<ll>> &graph) {
    tree[vertex].md = depth;
    tree[vertex].depth = depth;
    tree[vertex].parent = parent;
    for(const auto &x : graph[vertex]) {
        if(x == parent)
            continue;
        tree[vertex].md = max(tree[vertex].md, build_tree(x, vertex, depth + 1, tree, graph));
        tree[vertex].children.push_back(x);
    }
    return tree[vertex].md;
}
bool does_tom_win(const ll J, const ll K, const vector<Branch> &tree) {
    ll rj;
    rj = J;
    while(rj != -1) {
        if(tree[J].depth - tree[rj].depth >= tree[rj].depth - 1)
            return true;
        if(tree[rj].depth + min(K - 1 - (tree[J].depth - tree[rj].depth), tree[rj].md - tree[rj].depth) > K)
            return false;
        rj = tree[rj].parent;
    }
    return true;
}
int main() {
    FastIO;
    bool ok;
    ll i, j, u, v, N, T, J, K, C;
    cin >> C;
    while(C--) {
        cin >> N >> T >> J >> K;
        vector<vector<ll>> graph(N + 1);
        for(i = 1; i < N; i++) {
            cin >> u >> v;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        vector<Branch> tree(N + 1);
        build_tree(T, -1, 0, tree, graph);
        ok = does_tom_win(J, K, tree);
        if(!ok) {
            u = 0;
            while(tree[++u].depth != tree[T].md);
            tree = vector<Branch>(N + 1);
            build_tree(u, -1, 0, tree, graph);
            v = 0;
            while(tree[++v].depth != tree[u].md);
            for(i = 0; i < tree[u].md / 2; i++)
                v = tree[v].parent;
            tree = vector<Branch>(N + 1);
            build_tree(v, -1, 0, tree, graph);
            ok = (tree[v].md <= K);
        }
        cout << (ok ? "IGEN" : "NEM") << '\n';
    }
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1828 KiB
2 Elfogadva 0/0 3ms 2168 KiB
3 Elfogadva 5/5 3ms 2360 KiB
4 Elfogadva 1/1 4ms 2728 KiB
5 Elfogadva 1/1 4ms 2840 KiB
6 Elfogadva 1/1 4ms 3044 KiB
7 Elfogadva 1/1 4ms 3276 KiB
8 Elfogadva 1/1 3ms 3100 KiB
9 Elfogadva 1/1 4ms 3016 KiB
10 Elfogadva 1/1 4ms 3260 KiB
11 Elfogadva 2/2 4ms 3216 KiB
12 Elfogadva 2/2 4ms 3464 KiB
13 Elfogadva 1/1 4ms 3680 KiB
14 Elfogadva 2/2 137ms 12500 KiB
15 Elfogadva 2/2 125ms 8532 KiB
16 Elfogadva 2/2 136ms 12640 KiB
17 Elfogadva 2/2 123ms 17380 KiB
18 Elfogadva 2/2 144ms 12952 KiB
19 Elfogadva 2/2 131ms 12960 KiB
20 Elfogadva 2/2 86ms 19932 KiB
21 Elfogadva 2/2 119ms 8924 KiB
22 Elfogadva 2/2 119ms 8848 KiB
23 Elfogadva 3/3 114ms 15204 KiB
24 Elfogadva 2/2 136ms 13232 KiB
25 Elfogadva 3/3 126ms 13216 KiB
26 Elfogadva 2/2 127ms 15612 KiB
27 Elfogadva 2/2 136ms 8956 KiB
28 Elfogadva 3/3 136ms 8944 KiB