Submission #1011138

#TimeUsernameProblemLanguageResultExecution timeMemory
1011138damjandavkovDigital Circuit (IOI22_circuit)C++17
100 / 100
780 ms26320 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; ll r = 1000002022, p, n; vector<ll> en, nu, lz, wl, wr; void upd(int a, int b, int i) { if (wl[i] >= b || wr[i] <= a) return; if (wl[i] >= a && wr[i] <= b) { lz[i] ^= 1; return; } upd(a, b, 2 * i); upd(a, b, 2 * i + 1); nu[i] = en[i] = 0; if (lz[2 * i]) { nu[i] += en[2 * i]; en[i] += nu[2 * i]; } else { nu[i] += nu[2 * i]; en[i] += en[2 * i]; } if (lz[2 * i + 1]) { nu[i] += en[2 * i + 1]; en[i] += nu[2 * i + 1]; } else { nu[i] += nu[2 * i + 1]; en[i] += en[2 * i + 1]; } } void init(int N, int M, vector<int> P, vector<int> A) { n = N; ll m = M, i, a, b; vector<vector<int> > ch(n + m); vector<ll> t(n + m), d(n + m), pf, sf; for (i = 1; i < n + m; i++) ch[P[i]].push_back(i); for (i = n; i < n + m; i++) t[i] = 1; for (i = n - 1; i >= 0; i--) { t[i] = ch[i].size(); for (auto h : ch[i]) t[i] = t[i] * t[h] % r; } queue<int> q; d[0] = 1; q.push(0); while (!q.empty()) { a = q.front(); q.pop(); b = ch[a].size(); pf.resize(b + 1); sf.resize(b + 1); pf[0] = sf[b] = 1; for (i = 0; i < b; i++) pf[i + 1] = pf[i] * t[ch[a][i]] % r; for (i = b - 1; i >= 0; i--) sf[i] = sf[i + 1] * t[ch[a][i]] % r; for (i = 0; i < b; i++) { d[ch[a][i]] = (pf[i] * sf[i + 1] % r) * d[a] % r; q.push(ch[a][i]); } } p = m; while (p != (p & -p)) p++; en.resize(2 * p); nu.resize(2 * p); lz.resize(2 * p); wl.resize(2 * p); wr.resize(2 * p); for (i = p; i < 2 * p; i++) { nu[i] = 0; en[i] = 0; if (i < p + m) { if (A[i - p]) en[i] = d[i - p + n]; else nu[i] = d[i - p + n]; } lz[i] = 0; wl[i] = i; wr[i] = i + 1; } for (i = p - 1; i > 0; i--) { wl[i] = wl[2 * i]; wr[i] = wr[2 * i + 1]; lz[i] = 0; nu[i] = nu[2 * i] + nu[2 * i + 1]; en[i] = en[2 * i] + en[2 * i + 1]; } } int count_ways(int L, int R) { upd(L - n + p, R - n + p + 1, 1); if (lz[1]) return nu[1] % r; return en[1] % r; }
#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...