Submission #1359393

#TimeUsernameProblemLanguageResultExecution timeMemory
1359393opeleklanosDigital Circuit (IOI22_circuit)C++20
18 / 100
3052 ms4508 KiB
#include <iostream>
#include <vector>
using namespace std;

#define ll long long
#define MOD (ll)1000002022

vector<int> a;
vector<vector<ll>> adj;
vector<pair<ll, ll>> dp;
int n, m;

void init(int N, int M, vector<int> p, vector<int> A){
    adj.assign(N+M, {});
    a = A;
    n = N;
    m = M;
    for(int i = 1; i<p.size(); i++){
        adj[p[i]].push_back(i);
    }
    return;
}

int dfs(int st){

    if(adj[st].size() == 0){
        dp[st] = {a[st-n], 1 - a[st-n]};
        return a[st-n];
    }

    vector<pair<ll, ll>> v;
    v.assign(adj[st].size()+1, {0, 0});
    v[0].first = 1;

    dp[st].second = adj[st].size();
    for(auto i : adj[st]){
        dfs(i);
        dp[st].second = (dp[st].second * (dp[i].first + dp[i].second))%MOD;
        vector<pair<ll, ll>> newV(adj[st].size()+1, {-1, -1});
        newV[0].first = (v[0].first * dp[i].second)%MOD;
        for(int j = 1; j<newV.size(); j++){
            newV[j].first = (((v[j].first * dp[i].second)%MOD) + ((v[j-1].first * dp[i].first)%MOD))%MOD;
        }
        v = newV;
    }

    dp[st].first = 0;
    for(int i = 0; i<v.size(); i++){
        dp[st].first = (dp[st].first + ((i * v[i].first)%MOD))%MOD;
    }

    dp[st].second = (dp[st].second - dp[st].first + MOD)%MOD;

    return dp[st].first%MOD;
}

int count_ways(int L, int R){
    for(int i = L-n; i<=R-n; i++) a[i] = !a[i];
    dp.assign(n+m, {0-1, -1});
    return dfs(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...