Submission #869714

#TimeUsernameProblemLanguageResultExecution timeMemory
869714LudisseyDigital Circuit (IOI22_circuit)C++17
0 / 100
3046 ms2097152 KiB
#include "circuit.h"

#include <bits/stdc++.h>

using namespace std;
#define int long  long
int N,M;
const int MOD=1e9+2022;
vector<vector<int>> tree;
vector<int> state;
vector<int> depth;
vector<int> poss;

int dfs(int i, int on){
  if(i>=N){
    if(on) return state[i];
    else return 1-state[i];
  }
  int lo=dfs(tree[i][0],true)%MOD, lf=dfs(tree[i][0],false)%MOD;
  int ro=dfs(tree[i][1],true)%MOD, rf=dfs(tree[i][1],false)%MOD;
  int general=(lo*rf)%MOD+(ro*lf)%MOD;
  if(on) return general+((lo*ro*2)%MOD);
  return general+((2*lf*rf)%MOD);
}

void init(signed n, signed m, std::vector<signed> P, std::vector<signed> A) {
  N=n; M=m;
  tree.resize(N+M); state.resize(N+M);
  for (int i = 1; i < N+M; i++) tree[P[i]].push_back(i);
  for (int i = N; i < N+M; i++) state[i] = A[i-N];
}

signed count_ways(signed L, signed R) {
  poss.clear(); poss.resize(N+M,0);
  for (int i = L; i <= R; i++) state[i] = 1-state[i];
  signed d=dfs(0,true);
  return d;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...