제출 #1366563

#제출 시각아이디문제언어결과실행 시간메모리
1366563SofiatpcThe Ties That Guide Us (CEOI23_incursion)C++20
12 / 100
118 ms5112 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];

void dfs(int s, int p){
    for(int viz : adj[s])
        if(viz != p){
            marc[viz] = (marc[s]+1)%3;
            dfs(viz,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 });
    }

    dfs(safe,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 locate(vector<pair<int, int>> f, int ini, int t) {
    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 );
    }

    marc[ ini ] = t;
    int cur = adj[ini][0];
    marc[ cur ] = visit( cur );

    if( marc[cur] != (marc[ini]-1 +3)%3 ){
        visit( ini );

        if(sz( adj[ini] ) == 1)return;
        
        cur = adj[ini][1];
        marc[ cur ] = visit( cur );

        if(marc[cur] != (marc[ini]-1 +3)%3 ){
            visit(ini);
            if(sz( adj[ini] ) == 2)return;

            cur = adj[ini][2];
            marc[ cur ] = visit(cur);

            if(marc[cur] != (marc[ini]-1 +3)%3 ){
                visit(ini);
                return;
            }
        }
    }

    int lst = ini;
    while(1){
        int nxt = -1;
        for(int viz : adj[cur])
            if(viz != lst){ nxt = viz; break; }

        if(nxt == -1){
            if(marc[cur] != 0)visit(lst);
            return;
        }

        marc[ nxt ] = visit( nxt );

        if(marc[ nxt ] == (marc[cur]-1 +3)%3){
            lst = cur; cur = nxt;
        }else if(marc[ nxt ] == marc[cur]){
            visit(cur);
            visit(lst);
            return;
        }else{
            visit(cur);

            int mudou = 0;
            for(int viz : adj[cur])
                if(viz != lst && viz != nxt){lst = cur; cur = viz; mudou = 1; break; }

            if(!mudou)return;
            marc[cur] = visit(cur);
        }
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…