Submission #1224612

#TimeUsernameProblemLanguageResultExecution timeMemory
1224612LaMatematica14The Ties That Guide Us (CEOI23_incursion)C++20
12 / 100
144 ms7928 KiB
#include <bits/stdc++.h>
using namespace std;

int visit(int 𝑣);

vector<int> mark(vector<pair<int, int>> F, int safe) {
    int N = F.size()+2;
    vector<vector<int>> adj(N);
    for (auto x : F) {
        adj[x.first].push_back(x.second);
        adj[x.second].push_back(x.first);
    }
    vector<int> ret(N);
    ret[safe] = 2;
    function<void(int, int)> dfs = [&](int a, int p) -> void {
        for (int x : adj[a]) {
            if (x == p) continue;
            ret[x] = (ret[a]+2)%3;
            dfs(x, a);
        }
    };
    dfs(safe, 0);
    ret.erase(ret.begin());
    return ret;
}

void locate(vector<pair<int, int>> F, int curr, int t) {
    int N = F.size()+2; 
    vector<vector<int>> adj(N);
    for (auto x : F) {
        adj[x.first].push_back(x.second);
        adj[x.second].push_back(x.first);
    }
    vector<int> depth(N, 0);
    /*
    vector<int> seen(N, -1);
    seen[curr] = t;
    auto visitme = [&](int a) -> int {
        if (seen[a] == -1) seen[a] = visit(a);
        return seen[a];
    };*/

    function<void(int, int)> dfs = [&](int a, int p) {
        for (int x : adj[a]) {
            if (x == p) continue;
            dfs(x, a);
            depth[a] = max(depth[x]+1, depth[a]);
        }
    };
    dfs(curr, 0);

    int prev = 0;
    while (1) {
        int best = adj[curr][0], other = -1;
        if (best == prev) {
            if (adj[curr].size() == 1) return; // ok?
            best = adj[curr][1];
        }
        for (int x : adj[curr]) {
            if (x == prev || x == best) continue;
            if (depth[best] < depth[x]) {
                other = best;
                best = x;
            } else other = x;
        }
        
        prev = curr;
        int aus = visit(best);
        if (aus == (t+1)%3) curr = best, t = aus;
        else {
            visit(curr);
            if (other == -1) return;
            aus = visit(other);
            if (aus == (t+1)%3) curr = other, t = aus;
            else {
                visit(curr);
                return;
            }
        }
    }
    cout << "nogood";
    return;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...