제출 #639357

#제출 시각아이디문제언어결과실행 시간메모리
639357CSQ31디지털 회로 (IOI22_circuit)C++17
46 / 100
2882 ms14156 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; typedef long long int ll; const ll MOD = 1000002022; const int MAXN = 1e5+5; vector<int>adj[MAXN]; ll c[MAXN],sub[MAXN]; int n,m; void dfs(int v){ if(adj[v].empty())sub[v] = 1; else sub[v] = adj[v].size(); for(int x:adj[v]){ dfs(x); sub[v] = sub[v]*sub[x]%MOD; } } void dfs(int v,ll cur){ if(adj[v].empty()){ c[v-n] = cur; return; } int s = adj[v].size(); vector<ll>pref(s,1),suff(s,1); for(int i=0;i<s;i++){ pref[i] = sub[adj[v][i]]; suff[i] = sub[adj[v][i]]; if(i)pref[i] = pref[i]*pref[i-1]%MOD; } for(int i=s-2;i>=0;i--)suff[i] = suff[i]*suff[i+1]%MOD; for(int i=0;i<s;i++){ ll k = 1; if(i)k = pref[i-1]*k%MOD; if(i!=s-1)k = suff[i+1]*k%MOD; dfs(adj[v][i],(cur*k)%MOD); } } ll ans = 0; vector<int>a; 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++)adj[p[i]].push_back(i); dfs(0); dfs(0,1); for(int i=0;i<m;i++){ if(a[i])ans+=c[i]; ans%=MOD; } } int count_ways(int L, int R) { L-=n; R-=n; for(int i=L;i<=R;i++){ if(!a[i])ans+=c[i]; else ans+=MOD-c[i]; a[i]^=1; ans%=MOD; } return ans; }
#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...