Submission #974751

#TimeUsernameProblemLanguageResultExecution timeMemory
974751LucaIlieDigital Circuit (IOI22_circuit)C++17
46 / 100
3024 ms18956 KiB
#include "circuit.h"
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 2e5;
const int MOD = 1e9 + 2022;
bool active[MAX_N];
int value[MAX_N], dpTot[MAX_N];
vector<int> adj[MAX_N], prefix[MAX_N], suffix[MAX_N];
int n, m;

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

    dpTot[u] = 1;

    if ( adj[u].size() == 0 )
        return;

    for ( int v: adj[u] )
        dpTot[u] = (long long)dpTot[u] * dpTot[v] % MOD;
    dpTot[u] = (long long)dpTot[u] * adj[u].size() % MOD;
}

void dfsCalcValues( int u, int val ) {
    if ( adj[u].size() == 0 ) {
        value[u] = val;
        return;
    }

    prefix[u].resize( adj[u].size() + 1 );
    suffix[u].resize( adj[u].size() + 1 );

    prefix[u][0] = 1;
    for ( int i = 0; i < adj[u].size(); i++ ) {
        int v = adj[u][i];
        prefix[u][i + 1] = (long long)prefix[u][i] * dpTot[v] % MOD;
    }
    suffix[u][adj[u].size()] = 1;
    for ( int i = adj[u].size() - 1; i >= 0; i-- ) {
        int v = adj[u][i];
        suffix[u][i] = (long long)suffix[u][i + 1] * dpTot[v] % MOD;
    }

    for ( int i = 0; i < adj[u].size(); i++ ){
        int v = adj[u][i];
        dfsCalcValues( v, (long long)val * prefix[u][i] % MOD * suffix[u][i + 1] % MOD );
    }
}

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++ )
        active[v + n - m] = A[v];

    dfsDpTot( 0 );
    dfsCalcValues( 0, 1 );
}

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

    int ans = 0;
    for ( int i = n - m; i < n; i++ )
        ans = (ans + value[i] * active[i]) % MOD;

    return ans;
}

Compilation message (stderr)

circuit.cpp: In function 'void dfsCalcValues(int, int)':
circuit.cpp:37:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |     for ( int i = 0; i < adj[u].size(); i++ ) {
      |                      ~~^~~~~~~~~~~~~~~
circuit.cpp:47:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |     for ( int i = 0; i < adj[u].size(); i++ ){
      |                      ~~^~~~~~~~~~~~~~~
#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...