#include "circuit.h"
#include <vector>
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>>dp;
vector<int>a;
vector<vector<int>>adj;
int n,m;
const int MOD=1000002022;
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
dp.resize(N+M);
adj.resize(N+M);
a.resize(M);
n=N;
m=M;
for(int i=1;i<N+M;i++){
adj[P[i]].push_back(i);
}
for(int i=0;i<M;i++){
a[i]=A[i];
}
}
void dfs(int u, int p, vector<pair<int,int>>&Dp){
if(u>=n) return;
int l=0,l1=0,r=0,r1=0,cont=0;
for(int v: adj[u]){
if(v!=p){
cont++;
dfs(v,u,Dp);
if(cont==1){
l=Dp[v].second;
l1=Dp[v].first;
}
else{
r=Dp[v].second;
r1=Dp[v].first;
}
}
}
Dp[u].first=(l*r1)%MOD+(l1*r)%MOD+(2*l1*r1)%MOD;
Dp[u].second=(l*r1)%MOD+(l1*r)%MOD+(2*l*r)%MOD;
Dp[u].first%=MOD;
Dp[u].second%=MOD;
return;
}
int count_ways(int L, int R) {
for(int i=L;i<=R;i++){
a[i-n]=!a[i-n];
}
//f->prendido s->apagado
for(int i=0;i<m;i++){
if(a[i]==1){
dp[n+i].first=1;
dp[n+i].second=0;
}
else{
dp[n+i].first=0;
dp[n+i].second=1;
}
}
dfs(0,-1,dp);
return dp[0].first;
}
# | 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... |