Submission #1235821

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

typedef long long ll;

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;
        ans1[curr]=a0*b1 + a1*b0 + 2*a1*b1;
    }
}

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);
    }

    for(ll i=0; i<n; i++){
        assert(t[i].size()==2);
    }
}

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