Submission #767511

#TimeUsernameProblemLanguageResultExecution timeMemory
767511t6twotwoDigital Circuit (IOI22_circuit)C++17
89 / 100
3049 ms14064 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; using ll = long long; constexpr int mod = 1000002022; int add(int x, int y) { int z = x + y; if (z >= mod) { z -= mod; } return z; } int sub(int x, int y) { int z = x - y; if (z < 0) { z += mod; } return z; } int mul(int x, int y) { return (ll)x * y % mod; } int N, M, K; vector<int> P, A, tot, lazy, S, T; void apply(int p, int v) { if (v) { S[p] = sub(T[p], S[p]); lazy[p] ^= 1; } } void push(int p) { apply(p * 2 + 1, lazy[p]); apply(p * 2 + 2, lazy[p]); lazy[p] = 0; } void pull(int p) { S[p] = add(S[p * 2 + 1], S[p * 2 + 2]); } void update(int p, int l, int r, int L, int R) { if (R <= l || r <= L) { return; } if (L <= l && r <= R) { apply(p, 1); return; } int m = (l + r + 1) / 2; push(p); update(p * 2 + 1, l, m, L, R); update(p * 2 + 2, m, r, L, R); pull(p); } void init(int n, int m, vector<int> p, vector<int> a) { N = n, M = m; P = p, A = a; vector<vector<int>> ch(N); for (int i = 1; i < N + M; i++) { ch[P[i]].push_back(i); } tot.resize(N + M); for (int i = N; i < N + M; i++) { tot[i] = 1; } for (int i = N - 1; i >= 0; i--) { tot[i] = ch[i].size(); for (int j : ch[i]) { tot[i] = mul(tot[i], tot[j]); } } vector<int> f(N + M); f[0] = 1; for (int i = 1; i < N + M; i++) { f[i] = f[P[i]]; for (int j : ch[P[i]]) { if (i != j) { f[i] = mul(f[i], tot[j]); } } } K = 2 << __lg(M); S.resize(2 * K - 1); T.resize(2 * K - 1); lazy.resize(2 * K - 1); for (int i = 0; i < M; i++) { if (A[i] == 1) { S[i + K - 1] = f[i + N]; } T[i + K - 1] = f[i + N]; } for (int i = K - 2; i >= 0; i--) { S[i] = add(S[i * 2 + 1], S[i * 2 + 2]); T[i] = add(T[i * 2 + 1], T[i * 2 + 2]); } } int count_ways(int L, int R) { update(0, 0, K, L - N, R - N + 1); return S[0]; }
#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...