이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |