Submission #1235828

#TimeUsernameProblemLanguageResultExecution timeMemory
1235828marizaDigital Circuit (IOI22_circuit)C++20
0 / 100
6 ms1384 KiB
#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll MOD=1e9+2022;

ll n, m, a[1000];

vector<ll> t[2000];
ll ans0[2000], ans1[2000];
void dfs(ll curr, bool upd){
    // cout<<curr<<endl;
    if(curr>=n){
        ans0[curr]=(a[curr-n]==0);
        ans1[curr]=(a[curr-n]==1);
    }
    else{
        if(upd){
            dfs(t[curr][0],1);
            dfs(t[curr][1],1);
        }
        ll a0, a1, b0, b1;
        a0=ans0[t[curr][0]];
        a1=ans1[t[curr][0]];
        b0=ans0[t[curr][1]];
        b1=ans1[t[curr][1]];
        // cout<<curr<<" "<<2*a0*b0 + a0*b1 + a1*b0<<" "<<a0*b1 + a1*b0 + 2*a1*b1<<endl;
        ans0[curr]=(2*a0*b0 + a0*b1 + a1*b0)%MOD;
        ans1[curr]=(a0*b1 + a1*b0 + 2*a1*b1)%MOD;
    }
}

void init(int N, int M, vector<int> P, vector<int> A) {
    n=N;
    m=M;
    for(ll i=0; i<m; i++){
        a[i]=A[i];
    }
    for(ll i=1; i<n+m; i++){
        t[P[i]].push_back(i);
    }

    dfs(0,1);
}

int count_ways(int l, int r) {
    a[l-n]^=1;
    dfs(l,0);
    ll curr=l;
    while(curr>0){
        curr=(curr-1)/2;
        dfs(curr,0);
    }
    
    return ans1[0];
}
#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...