제출 #869756

#제출 시각아이디문제언어결과실행 시간메모리
869756LudisseyDigital Circuit (IOI22_circuit)C++17
0 / 100
3006 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; vector<vector<int>> memo; int mult=1; int dfs(int i, int on){ if(i>=N){ if(on) return state[i]; else return 1-state[i]; } if(memo[i][on]!=-1) return memo[i][on]; 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 ret=(lo*rf)%MOD+(ro*lf)%MOD; if(on) ret+=(lo*ro*2)%MOD; else ret+=(2*lf*rf)%MOD; return memo[i][on]=ret%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); memo.clear(); memo.resize(N+M, vector<int>(2,-1)); for (int i = 1; i < N+M; i++) tree[P[i]].push_back(i); state[N]=1; mult=dfs(0,true); 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); memo.clear(); memo.resize(N+M, vector<int>(2,-1)); int state_sum=0; for (int i = L; i <= R; i++) { state[i] = 1-state[i]; } for (int i = N; i < M+N; i++) { state_sum+=state[i]; } signed d=(state_sum%MOD*mult%MOD)%MOD; 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...