제출 #1366573

#제출 시각아이디문제언어결과실행 시간메모리
1366573SofiatpcThe Ties That Guide Us (CEOI23_incursion)C++20
0 / 100
88 ms6392 KiB
#include "incursion.h"
#include <bits/stdc++.h>

using namespace std;

#define sz(v) (int)v.size()
#define fi first
#define sc second
const int MAXN = 45005;
vector<int> adj[MAXN];
int marc[MAXN], pai[MAXN];

int dfs(int s, int p){
    for(int viz : adj[s])
        if(viz != p) marc[s] |= dfs(viz,s);
    return marc[s];
}

vector<int> mark(vector<pair<int, int>> f, int safe) {
    int n = 0;
    for(int i = 0; i < sz(f); i++){
        adj[ f[i].fi ].push_back( f[i].sc );
        adj[ f[i].sc ].push_back( f[i].fi );
        n = max( {n, f[i].fi, f[i].sc });
    }

    int rz;
    for(int i = 1; i <= n; i++)
        if(sz(adj[i]) == 2)rz = i;

    marc[safe] = 1;

    dfs(rz,0);

    vector<int> ans(n);
    for(int i = 1; i <= n; i++){
        ans[i-1] = marc[i];

        adj[i].clear(); marc[i] = 0;
    }

    return ans;
}

void enraizar(int s){
    for(int viz : adj[s])
        if(viz != pai[s]){
            pai[viz] = s;
            enraizar(viz);
        }
}

void locate(vector<pair<int, int>> f, int ini, int t) {
    int n = 0;
    for(int i = 0; i < sz(f); i++){
        adj[ f[i].fi ].push_back( f[i].sc );
        adj[ f[i].sc ].push_back( f[i].fi );
        n = max( {n, f[i].fi, f[i].sc });
    }

    int rz;
    for(int i = 1; i <= n; i++)
        if(sz(adj[i]) == 2)rz = i;

    enraizar(rz);

    marc[ini] = t;

    int cur = ini;
    while(marc[cur] == 0){
        marc[ pai[cur] ] = visit(pai[cur]);
        cur = pai[cur];
    }

    while(1){
        int nxt = -1;

        for(int viz : adj[cur])
            if(viz != pai[cur]){nxt = viz; break;}

        if(nxt == -1)return;
        
        marc[ nxt ] = visit(nxt);

        if(marc[nxt] == 1)cur = nxt;
        else{
            visit(cur);

            int nxt2 = -1;
            for(int viz : adj[cur])
                if(viz != pai[cur] && viz != nxt){nxt2 = viz; break;}
            
            if(nxt2 == -1)return;
            marc[nxt2] = visit(nxt2);

            if(marc[nxt2] != 1){
                visit(cur);
                return;
            }

            cur = nxt2;
        }
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…