제출 #1217422

#제출 시각아이디문제언어결과실행 시간메모리
1217422HappyCapybaraDigital Circuit (IOI22_circuit)C++17
100 / 100
387 ms31396 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; #define ll long long int m = 1000002022, N, M; vector<ll> pref, suf, subt; vector<vector<int>> g; vector<bool> lazy; vector<pair<ll, ll>> st; void pushdown(int node){ if (!lazy[node]) return; st[node*2].first = (st[node*2].second-st[node*2].first+2*m) % m; st[node*2+1].first = (st[node*2+1].second-st[node*2+1].first+2*m) % m; lazy[node*2] = !lazy[node*2]; lazy[node*2+1] = !lazy[node*2+1]; lazy[node] = false; } void update(int l, int r, int node=1, int tl=0, int tr=M-1){ //cout << l << " " << r << " " << node << " " << tl << " " << tr << endl; if (tl != tr) pushdown(node); if (l <= tl && tr <= r){ lazy[node] = true; st[node].first = (st[node].second-st[node].first+2*m) % m; return; } int tm = (tl+tr)/2; if (l <= tm) update(l, r, node*2, tl, tm); if (tm+1 <= r) update(l, r, node*2+1, tm+1, tr); st[node].first = (st[node*2].first+st[node*2+1].first) % m; } void build(vector<ll>& tot, int node=1, int tl=0, int tr=M-1){ if (tl == tr){ st[node] = {0, tot[tl]}; return; } int tm = (tl+tr)/2; build(tot, node*2, tl, tm); build(tot, node*2+1, tm+1, tr); st[node] = {0, (st[node*2].second+st[node*2+1].second) % m}; } void dfs(int cur, ll ct, vector<ll>& tot){ if (cur >= N){ tot[cur-N] = ct; return; } int s = g[cur].size(); for (int i=0; i<s; i++){ if (i == 0) pref[g[cur][i]] = subt[g[cur][i]]; else pref[g[cur][i]] = (pref[g[cur][i-1]]*subt[g[cur][i]]) % m; } for (int i=s-1; i>=0; i--){ if (i == s-1) suf[g[cur][i]] = subt[g[cur][i]]; else suf[g[cur][i]] = (suf[g[cur][i+1]]*subt[g[cur][i]]) % m; } for (int i=0; i<s; i++){ ll nt = ct; if (i != 0) nt = (nt*pref[g[cur][i-1]]) % m; if (i != s-1) nt = (nt*suf[g[cur][i+1]]) % m; dfs(g[cur][i], nt, tot); } } void init(int N, int M, vector<int> P, vector<int> A){ ::N = N; ::M = M; vector<ll> deg(N, 0); for (int i=1; i<N+M; i++) deg[P[i]]++; vector<ll> tot(M, 1); subt.resize(N+M, 1); for (int i=N-1; i>=0; i--){ subt[i] = (subt[i]*deg[i]) % m; if (i != 0) subt[P[i]] = (subt[P[i]]*subt[i]) % m; } pref.resize(N+M, 1); suf.resize(N+M, 1); g.resize(N+M); for (int i=N+M-1; i>0; i--) g[P[i]].push_back(i); dfs(0, 1, tot); st.resize(4*M); lazy.resize(4*M, false); build(tot); for (int i=0; i<M; i++){ if (A[i]) update(i, i); } } int count_ways(int L, int R){ update(L-N, R-N); return st[1].first; }
#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...