제출 #1272495

#제출 시각아이디문제언어결과실행 시간메모리
1272495thuhienneCats or Dogs (JOI18_catdog)C++20
38 / 100
3093 ms10352 KiB
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9;

int N, Q;
vector<int> adj[100005];
int parent[100005];
int type_pet[100005]; // 0 = none, 1 = cat, 2 = dog
int dp[100005][2];

void predfs(int node, int par) {
    parent[node] = par;
    for (int x : adj[node]) if (x != par) {
        predfs(x, node);
    }
}

void dfs(int node, int par) {
    dp[node][0] = dp[node][1] = 0;
    for (int x : adj[node]) if (x != par) {
        dfs(x, node);
        dp[node][0] += min(dp[x][0], dp[x][1] + 1);
        dp[node][1] += min(dp[x][1], dp[x][0] + 1);
    }
    if (type_pet[node] == 1) dp[node][1] = INF;
    if (type_pet[node] == 2) dp[node][0] = INF;
}

void recalc_up(int node) {
    while (node) {
        dp[node][0] = dp[node][1] = 0;
        for (int x : adj[node]) if (x != parent[node]) {
            dp[node][0] += min(dp[x][0], dp[x][1] + 1);
            dp[node][1] += min(dp[x][1], dp[x][0] + 1);
        }
        if (type_pet[node] == 1) dp[node][1] = INF;
        if (type_pet[node] == 2) dp[node][0] = INF;
        node = parent[node];
    }
}

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

int cat(int v) {
    type_pet[v] = 1;
    recalc_up(v);
    return min(dp[1][0], dp[1][1]);
}

int dog(int v) {
    type_pet[v] = 2;
    recalc_up(v);
    return min(dp[1][0], dp[1][1]);
}

int neighbor(int v) {
    type_pet[v] = 0;
    recalc_up(v);
    return min(dp[1][0], dp[1][1]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...