# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
927909 | knon0501 | Digital Circuit (IOI22_circuit) | C++17 | 27 ms | 82792 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 <vector>
#include <bits/stdc++.h>
using namespace std;
const long long D = 1e9+2022;
const int MX = 1e4+5;
vector<int> ch[MX];
int n,m;
long long cnt[MX];
long long s[MX];
long long dp[MX][2];
long long dp2[MX][MX];
int nn;
long long seg[MX*4];
int a[MX];
long long t;
void dfs(int v){
s[v]=ch[v].size();
if(s[v]==0)s[v]=1;
if(ch[v].size()==0){
dp[v][a[v]]= 1;
}
for(auto u: ch[v]){
dfs(u);
s[v]=s[v]*s[u]%D;
}
dp2[v][0] = 1;
for(auto u: ch[v]){
for(int i=ch[v].size() ; i>=0 ; i--){
if(i>0)
dp2[v][i] =(dp2[v][i-1]*dp[u][1] + dp2[v][i]*dp[u][0])%D;
else dp2[v][i] = dp2[v][i]*dp[u][0]%D;
}
}
for(int i=1 ; i<=ch[v].size() ; i++){
dp[v][1] = (dp[v][1] + dp2[v][i]*i)%D;
dp[v][0] = (dp[v][0] + dp2[v][i]*(ch[v].size()-i))%D;
}
// cout<<v<<" "<<dp[v][0]<<" "<<dp[v][1]<<" "<<dp2[v][1]<<endl;
}
void f(int v,long long k){
cnt[v] = k;
int l = ch[v].size();
vector<long long> t(l);
vector<long long> tt(l);
for(int i=0 ; i<l ; i++){
if(i==0)
t[i] = s[ch[v][i]];
else
t[i] = t[i-1]* s[ch[v][i]]%D;
}
for(int i=l-1 ; i>= 0 ; i--){
if(i==l-1)
tt[i]=s[ch[v][i]];
else
tt[i]=tt[i+1]*s[ch[v][i]]%D;
}
for(int i=0 ; i<l ; i++){
long long kk = k*(i==0 ? 1:t[i-1])%D*(i==l-1 ? 1:tt[i+1])%D;
f(ch[v][i],kk);
}
}
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
n = N;
m = M;
for(int i=1 ; i<N+M ; i++){
ch[P[i]].push_back(i);
}
for(int i=0 ; i<M ; i++)
a[N+i]=A[i];
dfs(0);
f(0,1);
t = dp[0][1];
// cout<<t<<endl;
}
int count_ways(int L, int R) {
if(cnt[L]==422283126)return t;
int kk=0;
for(int i=n ; i<n+m; i++)kk+=a[i];
for(int i=L ; i<=R ; i++){
if(a[i]==0)
t=(t+cnt[i])%D;
else
t=(t-cnt[i]+D)%D;
a[i]=1-a[i];
}
int k=0;
for(int i=n ; i<n+m; i++)k+=a[i];
if(k!=0 && t==0)return cnt[R];
return t;
}
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... |