Submission #1297631

#TimeUsernameProblemLanguageResultExecution timeMemory
1297631LucaLucaMCats or Dogs (JOI18_catdog)C++20
38 / 100
3094 ms5248 KiB
#include "catdog.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>

using ll = long long;
#define debug(x) #x << " = " << x < '\n'

const int INF = 1e9;
const int MAXN = 1e5;

struct Info {
  int dp[3];
  void init() {
    dp[0] = dp[1] = dp[2] = +INF;
  }
  void makeType(int x) {
    init();
    dp[x] = 0;
  }
  Info operator + (const Info &other) const {
    Info ret;
    ret.init();
    for (int x = 0; x < 3; x++) {
      for (int y = 0; y < 3; y++) {
        ret.dp[x] = std::min(ret.dp[x], dp[x] + other.dp[y] + 1);
        if ((x | y) != 3) {
          ret.dp[x | y] = std::min(ret.dp[x | y], dp[x] + other.dp[y]);
        }
      }
    }
    return ret;
  };
};

Info dp[MAXN];
int type[MAXN];

std::vector<int> g[MAXN];

void dfs(int u, int p) {
  if (p != u) {
    g[u].erase(std::find(g[u].begin(), g[u].end(), p));
  }
  for (int v : g[u]) {
    dfs(v, u);
  }
}

void dfsDP(int u) {
  dp[u].makeType(type[u]);
  for (int v : g[u]) {
    dfsDP(v);
    dp[u] = dp[u] + dp[v];
  }
}

void initialize(int N, std::vector<int> A, std::vector<int> B) {
  for (int i = 0; i + 1 < N; i++) {
    A[i]--, B[i]--;
    g[A[i]].push_back(B[i]);
    g[B[i]].push_back(A[i]);
  }

  dfs(0, 0);
}

int getAnswer() {
  dfsDP(0);
  return std::min({dp[0].dp[0], dp[0].dp[1], dp[0].dp[2]});
}

int cat(int v) {
  v--;
  type[v] = 1;
  return getAnswer();
}

int dog(int v) {
  v--;
  type[v] = 2;
  return getAnswer();
}

int neighbor(int v) {
  v--;
  type[v] = 0;
  return getAnswer();

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...