Submission #912723

#TimeUsernameProblemLanguageResultExecution timeMemory
912723biankDigital Circuit (IOI22_circuit)C++17
34 / 100
3102 ms12472 KiB
#include <bits/stdc++.h> using namespace std; typedef vector<int> vi; typedef long long ll; typedef pair<int,int> ii; #define ALL(x) x.begin(),x.end() #define SIZE(x) (int)x.size() #define forsn(i,s,n) for(int i=int(s);i<int(n);i++) #define forn(i,n) for(int i=0;i<int(n);i++) #define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--) #define dforn(i,n) for(int i=int(n)-1;i>=0;i--) #define fst first #define snd second #define pb push_back const int MAXN = 2e5; const int MOD = 1e9+2022; vi s, adj[MAXN]; int n, m; int dp[MAXN][2]; int mul(int x, int y) { return int(1LL*x*y%MOD); } void add(int &x, int y) { x+=y; if(x>=MOD) x-=MOD; } void compute_dp(int u) { int l=2*u+1, r=2*u+2; int aux = mul(dp[l][0], dp[r][1]); add(aux, mul(dp[l][1], dp[r][0])); dp[u][1] = dp[u][0] = aux; aux = mul(mul(2, dp[l][0]), dp[r][0]); add(dp[u][0], aux); aux = mul(mul(2, dp[l][1]), dp[r][1]); add(dp[u][1], aux); } void dfs_st(int u) { if(u>=n) { dp[u][s[u-n]] = 1; dp[u][!s[u-n]] = 0; return; } dfs_st(2*u+1), dfs_st(2*u+2); compute_dp(u); } bool bt=true; void init(int N, int M, vi P, vi A) { bt &= M==N+1; bt &= !(M&(M-1)); s=A, n=N, m=M; forsn(i,1,n+m) { adj[P[i]].pb(i); bt &= P[i]==(i-1)/2; } if(bt) dfs_st(0); } bool lazy[MAXN]; void pass(int u) { if(!lazy[u]) return; if(2*u+2<MAXN) { lazy[2*u+1] ^= 1; lazy[2*u+2] ^= 1; } swap(dp[u][0], dp[u][1]); lazy[u] = false; } void update(int ql, int qr, int nl, int nr, int u) { pass(u); if(qr <= nl || nr <= ql) { return; } if(ql <= nl && nr <= qr) { lazy[u] ^= 1; pass(u); return; } int nm=(nl+nr)/2; update(ql,qr,nl,nm,2*u+1); update(ql,qr,nm,nr,2*u+2); compute_dp(u); } ii dfs(int u) { int c=SIZE(adj[u]); if(!c) return {!s[u-n], s[u-n]}; vi ways(c+1,0); ways[0] = 1; forn(i,c) { ii child=dfs(adj[u][i]); dforn(j,c+1) { ways[j] = mul(ways[j],child.fst); if(j) add(ways[j],mul(ways[j-1],child.snd)); } } ii ans = {0,0}; forsn(i,1,c+1) { forn(j,i) add(ans.fst, ways[j]); forsn(j,i,c+1) add(ans.snd, ways[j]); } return ans; } int count_ways(int L, int R) { if(bt) { update(L-n, R-n+1, 0, m, 0); return dp[0][1]; } forsn(i,L,R+1) s[i-n]^=1; return int(dfs(0).snd); }
#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...