제출 #1359372

#제출 시각아이디문제언어결과실행 시간메모리
1359372maya_sDigital Circuit (IOI22_circuit)C++20
2 / 100
6 ms3596 KiB
#include "circuit.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<ll> info(2020);
ll n, m;
const ll mod = (1e9 + 2022);

void dfs(ll node, vector<vector<ll>> &g, vector<vector<ll>> &cnt){
  for(ll i : g[node]) dfs(i, g, cnt);
  ll c = g[node].size(); 
  if(c == 0){
    cnt[0][node] = (info[node] == 0);
    cnt[1][node] = (info[node] == 1);
    return;
  }
  vector<vector<vector<ll>>> dp(2, vector<vector<ll>>(c, vector<ll>(c)));
  vector<ll> suff_zeros(c+1, 1);
  for(ll i = c-1; i >= 0; i--) suff_zeros[i] = (cnt[0][g[node][i]] * suff_zeros[i+1]) % mod;
  dp[1][1][0] = cnt[1][g[node][0]];
  for(ll i = 0; i < c; i++) dp[1][0][i] = cnt[0][i];
  for(ll k = 1; k <= c; k++){
    for(ll j = 0; j < c; j++){
      dp[1][k][j] = dp[1][k-1][j-1] * cnt[1][g[node][j]] * suff_zeros[j+1];
    }
  }
}

void init(int N, int M, std::vector<int> p, std::vector<int> a) {
  n = N, m = M;
  vector<vector<ll>> g(n+m);
  for(ll i = 1; i < n+m; i++) g[p[i]].push_back(i);
  for(ll i = 0; i < m; i++) info[n + i] = a[i];
}

int count_ways(int l, int r) {
  ll ans = 0;
  for(ll i = l; i <= r; i++) info[i] ^= 1;
  for(ll i = 0; i < m; i++) ans += info[n + i];
  return ans;
}
#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...