Submission #812204

#TimeUsernameProblemLanguageResultExecution timeMemory
812204andrei_boacaDigital Circuit (IOI22_circuit)C++17
34 / 100
3070 ms21612 KiB
#include "circuit.h"
#include <bits/stdc++.h>
#include <vector>
//#include "stub.cpp"

using namespace std;
typedef long long ll;
const ll mod=1e9+2022;
ll a[300005],par[300005];
ll n,m,minim[300005],maxim[300005],dp[2][300005],toprop[300005];
vector<ll> muchii[300005];
ll nr[300005],aux[300005];
void calc(int nod)
{
    dp[1][nod]=dp[0][nod]=0;
    for(int j=0;j<=muchii[nod].size();j++)
        nr[j]=0;
    nr[0]=1;
    for(int i=0;i<muchii[nod].size();i++)
    {
        for(int j=0;j<=i+1;j++)
            aux[j]=0;
        for(int j=0;j<=i+1;j++)
        {
            ll val=(nr[j]*dp[0][muchii[nod][i]])%mod;
            aux[j]=(aux[j]+val)%mod;
            if(j>0)
            {
                val=(nr[j-1]*dp[1][muchii[nod][i]])%mod;
                aux[j]=(aux[j]+val)%mod;
            }
        }
        for(int j=0;j<=i+1;j++)
            nr[j]=aux[j];
    }
    for(ll i=0;i<=muchii[nod].size();i++)
    {
        ll nr1=(nr[i]*i)%mod;
        dp[1][nod]=(dp[1][nod]+nr1)%mod;
        ll nr0=(1LL*nr[i]*(muchii[nod].size()-i))%mod;
        dp[0][nod]=(dp[0][nod]+nr0)%mod;
    }
}
void build(int nod)
{
    dp[1][nod]=dp[0][nod]=0;
    minim[nod]=1e9;
    maxim[nod]=-1;
    if(muchii[nod].size()==0)
    {
        dp[a[nod]][nod]=1;
        dp[1-a[nod]][nod]=0;
        minim[nod]=nod;
        maxim[nod]=nod;
        return;
    }
    for(int i:muchii[nod])
    {
        build(i);
        minim[nod]=min(minim[nod],minim[i]);
        maxim[nod]=max(maxim[nod],maxim[i]);
    }
    calc(nod);
}
void prop(int nod)
{
    for(int i:muchii[nod])
    {
        swap(dp[0][i],dp[1][i]);
        toprop[i]^=1;
    }
}
void update(int nod,int l,int r)
{
    if(muchii[nod].size()>0&&toprop[nod])
    {
        prop(nod);
        toprop[nod]=0;
    }
    if(l<=minim[nod]&&r>=maxim[nod])
    {
        swap(dp[0][nod],dp[1][nod]);
        toprop[nod]^=1;
        return;
    }
    for(int i:muchii[nod])
    {
        if(!(maxim[i]<l||minim[i]>r))
            update(i,l,r);
    }
    calc(nod);
}
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
    n=N;
    m=M;
    for(int i=0;i<P.size();i++)
    {
        par[i]=P[i];
        if(i!=0)
            muchii[par[i]].push_back(i);
    }
    for(int i=0;i<A.size();i++)
        a[i+n]=A[i];
    build(0);
}

int count_ways(int L, int R) {
    update(0,L,R);
    return dp[1][0];
}


Compilation message (stderr)

circuit.cpp: In function 'void calc(int)':
circuit.cpp:16:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |     for(int j=0;j<=muchii[nod].size();j++)
      |                 ~^~~~~~~~~~~~~~~~~~~~
circuit.cpp:19:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for(int i=0;i<muchii[nod].size();i++)
      |                 ~^~~~~~~~~~~~~~~~~~~
circuit.cpp:36:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     for(ll i=0;i<=muchii[nod].size();i++)
      |                ~^~~~~~~~~~~~~~~~~~~~
circuit.cpp: In function 'void init(int, int, std::vector<int>, std::vector<int>)':
circuit.cpp:96:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   96 |     for(int i=0;i<P.size();i++)
      |                 ~^~~~~~~~~
circuit.cpp:102:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |     for(int i=0;i<A.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...