Submission #974739

#TimeUsernameProblemLanguageResultExecution timeMemory
974739LucaIlieDigital Circuit (IOI22_circuit)C++17
18 / 100
3008 ms7000 KiB
#include "circuit.h"
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 2e5;
const int MAX_M = 1e5;
const int MOD = 1e9 + 2022;
int dp1[MAX_N], dpTot[MAX_N];
vector<int> adj[MAX_N];
int n, m;

void dfs( int u ) {
    for ( int v: adj[u] )
        dfs( v );

    dpTot[u] = 1;
    dp1[u] = (u >= n - m ? dp1[u] : 0);
    for ( int v: adj[u] ) {
        dp1[u] = ((long long)dp1[u] * dpTot[v] + (long long)dpTot[u] * dp1[v] % MOD) % MOD;
        dpTot[u] = (long long)dpTot[u] * dpTot[v] % MOD;
        //printf( "fii %d %d %d %d\n", u, v, dpTot[u], dp1[u] );
    }
    dpTot[u] = (long long)dpTot[u] * max( 1, (int)adj[u].size() ) % MOD;

    //printf( "%d %d %d\n", u, dpTot[u], dp1[u] );
}

void init( int N, int M, vector<int> P, vector<int> A ) {
    n = N + M, m = M;

    for ( int v = 1; v < n; v++ )
        adj[P[v]].push_back( v );
    for ( int v = 0; v < m; v++ )
        dp1[v + n - m] = A[v];
}

int count_ways( int L, int R ) {
    for ( int i = L; i <= R; i++ )
        dp1[i] = !dp1[i];

    dfs( 0 );

    return dp1[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...