| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 812204 | andrei_boaca | Digital Circuit (IOI22_circuit) | C++17 | 3070 ms | 21612 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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)
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
