Submission #912701

#TimeUsernameProblemLanguageResultExecution timeMemory
912701biankDigital Circuit (IOI22_circuit)C++17
0 / 100
14 ms11096 KiB
#include <bits/stdc++.h> using namespace std; typedef vector<int> vi; typedef long long ll; typedef pair<ll,ll> pll; #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 fst first #define snd second #define pb push_back const int MAXN = 1e5; const int MOD = 1e9+2022; vi s, adj[MAXN], p; int n, m; int dp[MAXN][2]; int mul(int x, int y) { return int(1LL*x*y); } void add(int &x, int y) { x+=y; if(x>=MOD) x-=MOD; } void compute_dp(int u) { int l=adj[u][0], r=adj[u][1]; 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(int u) { if(SIZE(adj[u])==0) { dp[u][s[u-n]] = 1; dp[u][!s[u-n]] = 0; } int l=adj[u][0], r=adj[u][1]; dfs(l), dfs(r); compute_dp(u); } void init(int N, int M, vi P, vi A) { s=A, n=N, m=M, p=P; forsn(i,1,n+m) adj[P[i]].pb(i); dfs(0); } void update(int u) { dp[u][0]^=1, dp[u][1]^=1; u=p[u]; while(u!=-1) { compute_dp(u); u=p[u]; } } int count_ways(int L, int R) { forsn(i,L,R+1) update(i); return dp[0][1]; }
#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...