Submission #1057549

#TimeUsernameProblemLanguageResultExecution timeMemory
1057549sofijavelkovskaDigital Circuit (IOI22_circuit)C++17
100 / 100
655 ms34648 KiB
#include "circuit.h" //#include "stub.cpp" #include <bits/stdc++.h> using namespace std; const int MOD=1000002022, MAXN=(1<<17); int n, m; vector<int> parent, a; vector<int> adj[MAXN]; long long subtree[2*MAXN], factor[2*MAXN]; long long ones[2*MAXN-1], zeros[2*MAXN-1]; int lazy[2*MAXN-1]={0}; void calcsize(int x) { subtree[x]=1; if (x>=n) return; for (auto y : adj[x]) { calcsize(y); subtree[x]=subtree[x]*subtree[y]%MOD; } subtree[x]=subtree[x]*adj[x].size()%MOD; return; } void calcfactor(int x, long long current) { if (x>=n) return; int n=adj[x].size(); long long prefix[n]; prefix[0]=subtree[adj[x][0]]; for (int i=1; i<n; i++) prefix[i]=prefix[i-1]*subtree[adj[x][i]]%MOD; long long suffix[n]; suffix[n-1]=subtree[adj[x][n-1]]; for (int i=n-2; i>=0; i--) suffix[i]=suffix[i+1]*subtree[adj[x][i]]%MOD; for (int i=0; i<n; i++) { int y=adj[x][i]; factor[y]=current; if (i>0) factor[y]=factor[y]*prefix[i-1]%MOD; if (i+1<n) factor[y]=factor[y]*suffix[i+1]%MOD; calcfactor(y, factor[y]); } return; } void propagate(int x, int l, int r) { if (r-l==1) { lazy[x]=0; return; } if (lazy[x]==0) return; swap(ones[2*x+1], zeros[2*x+1]); swap(ones[2*x+2], zeros[2*x+2]); lazy[2*x+1]=(lazy[2*x+1]+1)%2; lazy[2*x+2]=(lazy[2*x+2]+1)%2; lazy[x]=0; return; } void update(int x, int l, int r, int lt, int rt) { if (l>=rt || r<=lt) return; if (l>=lt && r<=rt) { swap(ones[x], zeros[x]); lazy[x]=(lazy[x]+1)%2; return; } propagate(x, l, r); update(2*x+1, l, (l+r)/2, lt, rt); update(2*x+2, (l+r)/2, r, lt, rt); ones[x]=(ones[2*x+1]+ones[2*x+2])%MOD; zeros[x]=(zeros[2*x+1]+zeros[2*x+2])%MOD; return; } void buildtree(int x, int l, int r) { if (r-l==1) { if (l>=m) { ones[x]=0; zeros[x]=0; return; } if (a[l]==1) { ones[x]=factor[l+n]; zeros[x]=0; } else { ones[x]=0; zeros[x]=factor[l+n]; } return; } buildtree(2*x+1, l, (l+r)/2); buildtree(2*x+2, (l+r)/2, r); ones[x]=(ones[2*x+1]+ones[2*x+2])%MOD; zeros[x]=(zeros[2*x+1]+zeros[2*x+2])%MOD; return; } void init(int N, int M, vector<int> P, vector<int> A) { n=N; m=M; parent=P; a=A; for (int i=1; i<n+m; i++) adj[parent[i]].push_back(i); calcsize(0); calcfactor(0, 1); buildtree(0, 0, MAXN); return; } int count_ways(int l, int r) { l=l-n; r=r-n; update(0, 0, MAXN, l, r+1); return ones[0]; }
#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...