제출 #1331627

#제출 시각아이디문제언어결과실행 시간메모리
1331627nathan4690The Ties That Guide Us (CEOI23_incursion)C++20
30 / 100
223 ms16264 KiB
#include "incursion.h"
#include <bits/stdc++.h>
using namespace std;

int n;
vector<vector<int>> G;
vector<vector<int>> csz;
vector<int> sz;

void dfs(int u, int p){
    if(p != 0) {
        G[u].erase(find(G[u].begin(), G[u].end(), p));
        G[u].push_back(p);
    }
    csz[u].clear();
    sz[u] = 1;
    for(int c: G[u]){
        if(c != p){
            dfs(c, u);
            sz[u] += sz[c];
            csz[u].push_back(sz[c]);
        }
    }
    if(p) csz[u].push_back(n - sz[u]);
}

void Parse(vector<pair<int,int>> F){
    n = F.size() + 1;
    G.clear();
    G.resize(n + 1);
    csz.resize(n + 1);
    for(pair<int,int> e: F){
        int u = e.first, v = e.second;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    sz.clear();
    sz.resize(n + 1, 0);
    dfs(1, 0);
}

void dfs1(int u, int p, vector<int> &mk){
    if(p){
        int idx = find(G[u].begin(), G[u].end(), p) - G[u].begin();
        int mx = *max_element(csz[u].begin(), csz[u].end());
        mk[u] = (csz[u][idx] == mx);
    }
    for(int c: G[u]){
        if(c != p){
            dfs1(c, u, mk);
        }
    }
}

vector<int> mark(vector<pair<int, int>> F, int safe) {
    Parse(F);
    vector<int> res(n + 1, 0);
    dfs1(safe, 0, res);
    res.erase(res.begin());
    return res;
}

template<class T>
void Erase(vector<T> &v, T e){
    auto it = find(v.begin(), v.end(), e);
    if(it == v.end()) return;
    v.erase(it);
}

void locate(vector<pair<int, int>> F, int curr, int t) {
    Parse(F);
    mt19937 rng(1234);
    shuffle(F.begin(), F.end(), rng);
    vector<int> vmx(n + 1);
    vector<vector<int>> vu[2];
    vu[0].resize(n + 1);
    vu[1].resize(n + 1);
    for(int i = 1; i <= n; i++){
        vmx[i] = *max_element(csz[i].begin(), csz[i].end());
        for(int j = 0; j < G[i].size(); j++){
            vu[csz[i][j] == vmx[i]][i].push_back(G[i][j]);
        }
    }
    int pre = curr;
    while(1){
        if(vu[t][curr].empty()) {
            if(t){
                visit(pre);
            }
            break;
        }
        int nxt = vu[t][curr].back();
//        vu[t][curr].pop_back();
        int ct = t;
        t = visit(nxt);
        if(vu[ct][curr].size() == 1){
            Erase(vu[t][nxt], curr);
            Erase(vu[t^1][nxt], curr);
        }
        pre = curr;
        curr = nxt;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...