Submission #1024498

#TimeUsernameProblemLanguageResultExecution timeMemory
1024498vjudge1Digital Circuit (IOI22_circuit)C++17
34 / 100
3039 ms17752 KiB
#include "circuit.h" #include <bits/stdc++.h> #define ll long long #define sz(s) (int)s.size() #define pb push_back using namespace std; const int MAX=2e5+10; const int mod=1000002022; int n,m; vector<int> a; vector<int> g[MAX]; int dp[MAX],s[MAX]; void dfs(int v){ if(g[v].empty()){ dp[v]=a[v-n]; s[v]=1; return; } s[v]=sz(g[v]); for(auto to:g[v]){ dfs(to); s[v]=s[v]*1ll*s[to]%mod; } vector<int> d(n+m,0); d[0]=1; for(int i=0;i<sz(g[v]);i++){ int to=g[v][i]; for(int j=i+1;j>=0;j--){ int p=d[j]; d[j]=d[j]*1ll*(s[to]-dp[to]+mod)%mod; if(j-1>=0)d[j]+=d[j-1]*1ll*dp[to]%mod; d[j]%=mod; } } for(int i=1;i<=sz(g[v]);i++){ dp[v]+=i*1ll*d[i]%mod; dp[v]%=mod; } } struct segtree{ int t[4*MAX]; int s[4*MAX]; int add[4*MAX]; void build(int v,int tl,int tr,vector<int> &a){ add[v]=0; if(tl==tr){ s[v]=1; t[v]=a[tl]; return; } int tm=(tl+tr)/2; build(2*v,tl,tm,a); build(2*v+1,tm+1,tr,a); t[v]=0; for(int i=1;i<4;i++){ int prod=1; if(i&1){ prod=prod*1ll*t[2*v]%mod; } else{ prod=prod*1ll*(s[2*v]-t[2*v]+mod)%mod; } if(i&2){ prod=prod*1ll*t[2*v+1]%mod; } else{ prod=prod*1ll*(s[2*v+1]-t[2*v+1]+mod)%mod; } t[v]=t[v]+__builtin_popcount(i)*1ll*prod%mod; t[v]%=mod; } // cout<<v<<" "<<tl<<" "<<tr<<" "<<t[v]<<"\n"; s[v]=2ll*s[2*v]*s[2*v+1]%mod; } void make(int v){ add[v]^=1; t[v]=(s[v]-t[v]+mod)%mod; } void push(int v){ if(add[v]){ make(2*v); make(2*v+1); } add[v]=0; } void update(int v,int tl,int tr,int l,int r){ if(l>r||tl>r||l>tr)return; if(l<=tl&&tr<=r){ make(v); // cout<<l<<" "<<r<<" "<<tl<<" "<<tr<<" "<<t[v] <<"\n"; return; } int tm=(tl+tr)/2; push(v); update(2*v,tl,tm,l,r); update(2*v+1,tm+1,tr,l,r); t[v]=0; for(int i=1;i<4;i++){ int prod=1; if(i&1){ prod=prod*1ll*t[2*v]%mod; } else{ prod=prod*1ll*(s[2*v]-t[2*v]+mod)%mod; } if(i&2){ prod=prod*1ll*t[2*v+1]%mod; } else{ prod=prod*1ll*(s[2*v+1]-t[2*v+1]+mod)%mod; } t[v]=t[v]+__builtin_popcount(i)*1ll*prod%mod; t[v]%=mod; } } }T; bool st=0; void init(int N, int M,vector<int> P,vector<int> A) { n=N; m=M; a=A; for(int i=1;i<N+M;i++){ g[P[i]].pb(i); } { int x=1; while(x<M)x*=2; if(x==M&&N==M-1)st=1; } if(st)T.build(1,0,M-1,a); } int count_ways(int L, int R) { // cout<<st<<"\n"; if(st){ T.update(1,0,m-1,L-n,R-n); return T.t[1]; } for(int i=0;i<n+m;i++)dp[i]=0; for(int i=L;i<=R;i++)a[i-n]^=1; dfs(0); return dp[0]; }

Compilation message (stderr)

circuit.cpp: In function 'void dfs(int)':
circuit.cpp:34:17: warning: unused variable 'p' [-Wunused-variable]
   34 |             int p=d[j];
      |                 ^
#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...