Submission #883995

#TimeUsernameProblemLanguageResultExecution timeMemory
883995vjudge1Cats or Dogs (JOI18_catdog)C++17
8 / 100
21 ms3420 KiB
#include <bits/stdc++.h>

#include "catdog.h"

#define fi first
#define se second

#define bit(mask, i) (((mask) >> (i)) & 1)

using namespace std;

using ll = long long;
using pii = pair<int, int>;

const int NMAX = 1e5+5;
const int INF = 1e9+5;

int n;
vector<pii> g[NMAX];
int a[NMAX], daddy[NMAX];

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

bool check(int mask) {
   int vis = 0;
   function<bool(int, int)> dfs = [&](int x, int t) {
      if (a[x] != t && a[x]) return false;
      vis |= 1 << x;
      for (auto &u : g[x]) {
         if (!bit(mask, u.se) && !bit(vis, u.fi)) {
            if (!dfs(u.fi, t))
               return false;
         }
      }
      return true;
   };
   for (int i = 1; i <= n; i++) {
      if (a[i] && !bit(vis, i) && !dfs(i, a[i]))
         return false;
   }
   return true;
}

int calc() {
   int ret = INF;
   for (int mask = 0; mask < 1 << (n - 1); mask++) {
      if (__builtin_popcount(mask) >= ret)
         continue;
      if (check(mask))
         ret = __builtin_popcount(mask);
   }
   return ret;
}

int cat(int v) {
   a[v] = 1;
   return calc();
}

int dog(int v) {
   a[v] = 2;
   return calc();
}

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