Submission #1194006

#TimeUsernameProblemLanguageResultExecution timeMemory
1194006LudisseyDigital Circuit (IOI22_circuit)C++17
18 / 100
3027 ms5660 KiB
#include "circuit.h"
#include <bits/stdc++.h>
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define int long long
using namespace std;

int N,M;
const int MOD=1e9+2022;
vector<vector<int>> child;
vector<int> p;
vector<int> aP;
vector<int> a;
vector<int> dp;

int dfs(int x){
    if(x>=N) return (dp[x]=a[x]);
    dp[x]=0;
    int mP=1;
    vector<int> rgt(sz(child[x])+1,1);
    for (int j=sz(child[x])-1; j>=0; j--) {
        dfs(child[x][j]);
        rgt[j]=(rgt[j+1]*aP[child[x][j]])%MOD;
    }
    for (int j=0; j<sz(child[x]); j++) {
        int u=child[x][j];
        dp[x]=(dp[x]+((dp[u]*((rgt[j+1]*mP)%MOD))%MOD))%MOD;
        mP=(mP*aP[u])%MOD;
    }
    return dp[x];
}


int setup_ap(int x){
    if(x>=N) return aP[x]=1;
    aP[x]=1;
    for (auto u : child[x]) aP[x]=(aP[x]*setup_ap(u))%MOD;
    aP[x]=(aP[x]*sz(child[x]))%MOD;
    return (aP[x])%MOD;
}

void init(signed n, signed m, std::vector<signed> P, std::vector<signed> A) {
    N=n; M=m;
    p.resize(N+M);
    aP.resize(N+M);
    dp.resize(N+M);
    for (int i = 0; i < N+M; i++) p[i]=P[i];
    child.resize(N+M); a.resize(N+M);
    for (int i = 1; i < N+M; i++) child[P[i]].push_back(i);
    for (int i = N; i < N+M; i++) a[i] = A[i-N];
    setup_ap(0);
}

signed count_ways(signed L, signed R) {
    for (int i = L; i <= R; i++) a[i] = 1-a[i];
    dp.clear();
    dp.resize(N+M);
    dfs(0);
    return (int)((dp[0])%MOD);
}
#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...