Submission #1024466

#TimeUsernameProblemLanguageResultExecution timeMemory
1024466vjudge1Digital Circuit (IOI22_circuit)C++17
0 / 100
420 ms18520 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; #define rall(s) s.rbegin(), s.rend() #define all(s) s.begin(), s.end() #define sz(s) (int) s.size() #define s second #define f first using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; const int N = 5e5, mod = 1000002022; int n, m, is = 1; vector<int> g[N], a(N); pii t[4 * N]; int swp[4 * N]; pii f(pii x, pii y) { ll val[3]; val[0] = (x.s * 1ll * y.s) % mod; val[1] = ((x.f * 1ll * y.s) + (x.s * 1ll * y.f)) % mod; val[2] = (x.f * 1ll * y.f) % mod; pii v; v.f = (val[1] + val[2] * 2) % mod; v.s = (val[1] + val[0] * 2) % mod; return v; } void bld(int u = 1, int tl = 0, int tr = m - 1) { if (tl == tr) { if (a[tl + n]) t[u] = {1, 0}; t[u] = {0, 1}; return; } int mid = (tl + tr) / 2; bld(u * 2, tl, mid); bld(u * 2 + 1, mid + 1, tr); t[u] = f(t[u * 2], t[u * 2 + 1]); } void push(int u, int tl, int tr) { if (!swp[u]) return; swap(t[u].f, t[u].s); if (tl < tr) { swp[u * 2] ^= 1; swp[u * 2 + 1] ^= 1; } swp[u] = 0; } void upd(int l, int r, int u = 1, int tl = 0, int tr = m - 1) { push(u, tl, tr); if (tl > r || tr < l) return; if (tl >= l && tr <= r) { swp[u] = 1; push(u, tl, tr); return; } int mid = (tl + tr) / 2; upd(l, r, u * 2, tl, mid); upd(l, r, u * 2 + 1, mid + 1, tr); t[u] = f(t[u * 2], t[u * 2 + 1]); } void init(int nn, int M, vector<int> P, vector<int> A) { n = nn, m = M; for (int i = 0; i < m; i++) a[i + n] = A[i]; for (int i = 1; i < n + m; i++) { if (P[i] != (i - 1) / 2) is = 0; g[P[i]].push_back(i); } if (__builtin_popcount(m) > 1) is = 0; if (is) bld(); } pii get(int u) { if (!sz(g[u])) { if (a[u]) return {1, 0}; return {0, 1}; } int cnt = 0; vector<ll> val(sz(g[u]) + 1); val[0] = 1; for (int to: g[u]) { cnt++; auto [x, y] = get(to); for (int i = cnt; i >= 0; i--) { val[i] = (val[i] * y) % mod; if (i) val[i] = (val[i] + val[i - 1] * x) % mod; } } ll x = 0, y = 0; for (int i = 0; i <= cnt; i++) { x = (x + val[i] * i) % mod; y = (y + val[i] * (cnt - i)) % mod; } return {x, y}; } int count_ways(int l, int r) { if (is) { upd(l, r); return t[1].f; } for (int i = l; i <= r; i++) { a[i] = 1 - a[i]; } return get(0).f; }
#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...