Submission #1235560

#TimeUsernameProblemLanguageResultExecution timeMemory
1235560Muhammad_AneeqDigital Circuit (IOI22_circuit)C++17
18 / 100
3044 ms7928 KiB
#include "circuit.h"
#include <vector>
#include <iostream>
using namespace std;
#define ll long long
int const NPM=2e5+10,mod=1000002022;
vector<int>nei[NPM]={};
long long dp[NPM][2]={};
long long ways[2][NPM]={};
int P[NPM]={};
int l[NPM],r[NPM];
bool st[NPM]={};
int n,m;
long long mul(ll a,ll b)
{
    return (a*b)%mod;
}
long long add(ll a,ll b)
{
    return (a+b)%mod;
}
void dfs(int u)
{
    if (u>=n)
    {
        dp[u][st[u]]=1;
        dp[u][1-st[u]]=0;
        l[u]=r[u]=u;
        // cout<<u<<' '<<dp[u][0]<<' '<<dp[u][1]<<endl;
        return;
    }
    l[u]=NPM,r[u]=0;
    for (auto i:nei[u])
    {
        dfs(i);
        l[u]=min(l[i],l[u]);
        r[u]=max(r[i],r[u]);
    }
    int sz=nei[u].size();
    for (int i=1;i<=sz;i++)
        ways[0][i]=0;
    ways[0][0]=1;
    for (auto i:nei[u])
    {
        for (auto j:{0,1})
        {
            for (int k=sz;k>=j;k--)
                ways[1][k]=add(ways[1][k],mul(ways[0][k-j],dp[i][j]));
        }
        for (int k=0;k<=sz;k++)
        {
            ways[0][k]=ways[1][k];
            ways[1][k]=0;
        }
    }
    dp[u][1]=0;
    dp[u][0]=0;
    for (int i=0;i<=sz;i++)
    {
        dp[u][1]=add(dp[u][1],mul(ways[0][i],i));
        dp[u][0]=add(dp[u][0],mul(ways[0][i],(sz-i)));
    }
    // cout<<u<<' '<<dp[u][0]<<' '<<dp[u][1]<<endl;
}
void init(int N, int M, vector<int> P, vector<int> A) 
{
    n=N;
    m=M;
    for (int i=1;i<n+m;i++)
        nei[P[i]].push_back(i);
    for (int i=n;i<n+m;i++)
        st[i]=A[i-n];
}
int count_ways(int L, int R) 
{
    for (int i=L;i<=R;i++)
        st[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...