Submission #1245699

#TimeUsernameProblemLanguageResultExecution timeMemory
1245699NeltDigital Circuit (IOI22_circuit)C++20
2 / 100
193 ms9664 KiB
#include "circuit.h" #include <bits/stdc++.h> #define ll long long #define endl "\n" using namespace std; const ll N = 2e5 + 5, mod = 1e9 + 2022; vector<ll> g[N]; ll a[N], n, m, sub[N], p[N], val[N]; ll st[2][N << 2], lazy[N << 2]; void init(ll v) { sub[v] = max(1, (int)g[v].size()); for (ll to : g[v]) init(to), sub[v] = sub[v] * sub[to] % mod; } void dfs(ll v) { ll pref[g[v].size()], suf[g[v].size()]; for (ll i = 0; i < g[v].size(); i++) pref[i] = (i == 0 ? 1 : pref[i - 1]) * sub[g[v][i]] % mod; for (ll i = (int)g[v].size() - 1; i >= 0; i--) suf[i] = (i + 1 < g[v].size() ? suf[i + 1] : 1) * sub[g[v][i]] % mod; for (ll i = 0; i < g[v].size(); i++) val[g[v][i]] = (i - 1 < 0 ? 1 : pref[i - 1]) * (i + 1 < g[v].size() ? suf[i + 1] : 1) % mod * val[v] % mod, dfs(g[v][i]); } void build(ll l, ll r, ll v) { if (l == r) { st[a[l + n]][v] = val[l + n]; return; } ll mid = (l + r) >> 1; build(l, mid, v << 1); build(mid + 1, r, v << 1 | 1); for (ll i = 0; i < 2; i++) st[i][v] = st[i][v << 1] + st[i][v << 1 | 1]; } void push(ll v, ll l, ll r) { if (l != r and lazy[v]) { swap(st[0][v << 1], st[1][v << 1]); swap(st[0][v << 1 | 1], st[1][v << 1 | 1]); lazy[v << 1] ^= 1; lazy[v << 1 | 1] ^= 1; lazy[v] = 0; } } void modify(ll i, ll j, ll l, ll r, ll v) { if (max(i, l) > min(j, r)) return; push(v, l, r); if (i <= l and r <= j) { swap(st[0][v], st[1][v]); lazy[v] ^= 1; return; } ll mid = (l + r) >> 1; modify(i, j, l, mid, v << 1); modify(i, j, mid + 1, r, v << 1 | 1); for (ll i = 0; i < 2; i++) st[i][v] = st[i][v << 1] + st[i][v << 1 | 1]; } void init(int N, int M, std::vector<int> P, std::vector<int> A) { n = N, m = M; for (ll i = 1; i < n + m; i++) g[p[i] = P[i]].push_back(i); for (ll i = 0; i < m; i++) a[i + n] = A[i]; init(0); val[0] = 1; dfs(0); build(0, m - 1, 1); } int count_ways(int l, int r) { modify(l - n, r - n, 0, m - 1, 1); return st[1][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...