Submission #1368270

#TimeUsernameProblemLanguageResultExecution timeMemory
1368270avighnaDigital Circuit (IOI22_circuit)C++20
18 / 100
3070 ms3868 KiB
#include <bits/stdc++.h>

using namespace std;

namespace {
int N, M;
vector<vector<int>> adj;
vector<int> A;

using int64 = long long;
const int md = 1000002022;
} // namespace

void init(int N, int M, vector<int> P, vector<int> A) {
  ::N = N, ::M = M;
  adj.resize(N + M + 1);
  for (int i = 1; i < N + M; ++i) {
    adj[P[i]].push_back(i);
  }
  ::A = A;
}

int count_ways(int L, int R) {
  for (int i = L; i <= R; ++i) {
    A[i - N] = 1 - A[i - N];
  }
  auto dfs = [&](auto &&self, int u) -> pair<int64, int64> {
    if (u >= N) {
      return {1 - A[u - N], A[u - N]};
    }
    vector<int64> poly(adj[u].size() + 1);
    poly[0] = 1;
    for (int &i : adj[u]) {
      auto [f0, g0] = self(self, i);
      vector<int64> p = {f0, g0};
      vector<int64> mulr(adj[u].size() + 1);
      for (int i = 0; i < int(poly.size()); ++i) {
        for (int j = 0; j < 2 && i + j < int(mulr.size()); ++j) {
          mulr[i + j] = (mulr[i + j] + (poly[i] * p[j]) % md) % md;
        }
      }
      poly = mulr;
    }
    auto suff = poly, pref = poly;
    for (int i = int(poly.size()) - 2; i >= 0; --i) {
      suff[i] = (suff[i] + suff[i + 1]) % md;
    }
    for (int i = 1; i < int(poly.size()); ++i) {
      pref[i] = (pref[i - 1] + pref[i]) % md;
    }

    int64 with = 0, without = 0;
    for (int i = 1; i <= int(adj[u].size()); ++i) {
      with = (with + suff[i]) % md;
      without = (without + pref[i - 1]) % md;
    }
    return {without, with};
  };
  return dfs(dfs, 0).second;
}

#ifdef MACOS_LOCAL
#include "stub.cpp"
#endif
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...