Submission #745268

#TimeUsernameProblemLanguageResultExecution timeMemory
745268doowey디지털 회로 (IOI22_circuit)C++17
18 / 100
3050 ms7044 KiB
#include <bits/stdc++.h>
#include "circuit.h"

using namespace std;

typedef long long ll;

const int N = (int)2e5 + 10;
const int MOD = (int)1e9 + 2022;
vector<int> T[N];
int dp[N][2];

int add(int x, int y){
    x += y;
    if(x >= MOD) x -= MOD;
    else if(x < 0) x += MOD;
    return x;
}

int mult(int x, int y){
    return (x * 1ll * y) % MOD;
}

void dfs(int u){
    if(T[u].empty()) return;
    int S = 0;
    int W = 1;
    dp[u][0] = 1;
    for(auto x : T[u]){
        dfs(x);

        S = mult(S, add(dp[x][0], dp[x][1]));
        S = add(S, mult(W, dp[x][1]));
        W = mult(W, add(dp[x][0], dp[x][1]));
        dp[u][0] = mult(dp[u][0], add(dp[x][0], dp[x][1]));
    }
    dp[u][1] = S;
    dp[u][0] = mult(dp[u][0], (int)T[u].size());
    dp[u][0] = add(dp[u][0], -dp[u][1]);
}

int n, m;

void init(int _n, int _m, std::vector<int> P, std::vector<int> A) {
    n = _n;
    m = _m;
    for(int i = 1; i < n + m; i ++ ){
        T[P[i]].push_back(i);
    }
    for(int i = 0 ; i < m ; i ++ ){
        if(A[i] == 0){
            dp[i + n][0] = 1;
            dp[i + n][1] = 0;
        }
        else{
            dp[i + n][0] = 0;
            dp[i + n][1] = 1;
        }
    }
}

int count_ways(int li, int ri) {
    for(int i = li ; i <= ri ; i ++ ){
        swap(dp[i][0], dp[i][1]);
    }
    dfs(0);
    return dp[0][1];
}
#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...