제출 #1347258

#제출 시각아이디문제언어결과실행 시간메모리
1347258hridoyCats or Dogs (JOI18_catdog)C++17
0 / 100
1 ms2628 KiB
#include <bits/stdc++.h>
using namespace std;

int n;
vector<int> adj[100005];
int state[100005]; 


pair<bool,bool> dfs(int node, int parent) {
    bool hasCat = (state[node] == 1);
    bool hasDog = (state[node] == 2);

    for (int next : adj[node]) {
        if (next != parent) {
            auto [c, d] = dfs(next, node);
            hasCat |= c;
            hasDog |= d;
        }
    }
    return {hasCat, hasDog};
}

int danger;

void dfs2(int node, int parent) {
    bool nodeCat = (state[node] == 1);
    bool nodeDog = (state[node] == 2);

    for (int next : adj[node]) {
        if (next != parent) {
            auto [childCat, childDog] = dfs(next, node);

           
            auto [totalCat, totalDog] = dfs(1, -1); 

            bool restCat = totalCat && !(!totalCat); 
            bool restDog = totalDog;

            

            dfs2(next, node);
        }
    }
}

int calculateDanger() {
    danger = 0;

    auto [totalCat, totalDog] = dfs(1, -1);
    if (!totalCat || !totalDog) return 0;

 

    function<void(int, int)> solve = [&](int node, int par) {
        for (int next : adj[node]) {
            if (next != par) {
                auto [childCat, childDog] = dfs(next, node);

               

                bool parentCat = totalCat; 
                bool parentDog = totalDog;

              
                if (childCat && !childDog && parentDog) danger++;
              
                else if (childDog && !childCat && parentCat) danger++;
               
                else if (childCat && childDog) danger++;

                solve(next, node);
            }
        }
    };

    solve(1, -1);
    return danger;
}

void initialize(int N, vector<int> A, vector<int> B) {
    n = N;
    for (int i = 0; i < N - 1; i++) {
        adj[A[i]].push_back(B[i]);
        adj[B[i]].push_back(A[i]);
    }
    fill(state + 1, state + N + 1, 0);
}

int cat(int v) { state[v] = 1; return calculateDanger(); }
int dog(int v) { state[v] = 2; return calculateDanger(); }
int neighbor(int v) { state[v] = 0; return calculateDanger(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...