Submission #95890

#TimeUsernameProblemLanguageResultExecution timeMemory
95890onjo0127Cats or Dogs (JOI18_catdog)C++11
0 / 100
6 ms4984 KiB
#include "catdog.h"
#include <bits/stdc++.h>
using namespace std;

int A[100009], D[2][100009];
vector<int> adj[100009], tree[100009];

void dfs(int x, int p) {
    for(auto& it: adj[x]) {
        if(it != p) {
            tree[x].push_back(it);
            dfs(it, x);
        }
    }
}

void initialize(int N, vector<int> A, vector<int> B) {
    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);
    }
    dfs(1, 1);
}

void go(int x) {
    for(auto& it: tree[x]) go(it);
    if(A[x] == 0) {
        int s1 = 0, s2 = 0;
        for(auto& it: tree[x]) {
            if(A[it] == 0) {
                s1 += D[0][it];
                s2 += D[1][it];
            }
            if(A[it] == 1) {
                s1 += D[0][it];
                s2 += D[0][it] + 1;
            }
            if(A[it] == 2) {
                s1 += D[1][it] + 1;
                s2 += D[1][it];
            }
        }
        D[0][x] = s1;
        D[1][x] = s2;
    }
    if(A[x] == 1) {
        int s = 0;
        for(auto& it: tree[x]) s += min(D[0][it], D[1][it] + 1);
        D[0][x] = s;
        D[1][x] = 1e9;
    }
    if(A[x] == 2) {
        int s = 0;
        for(auto& it: tree[x]) s += min(D[0][it] + 1, D[1][it]);
        D[0][x] = 1e9;
        D[1][x] = s;
    }
}

int DP() {
    go(1);
    return min(D[0][1], D[1][1]);
}

int cat(int v) {
    A[v] = 1;
    return DP();
}

int dog(int v) {
    A[v] = 2;
    return DP();
}

int neighbor(int v) {
    A[v] = 0;
    return DP();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...