Submission #1219991

#TimeUsernameProblemLanguageResultExecution timeMemory
1219991banganDigital Circuit (IOI22_circuit)C++20
52 / 100
371 ms23520 KiB
#include "circuit.h" // #include <vector> #include <bits/stdc++.h> using i64 = long long; constexpr int mod = 1'000'002'022; int n, m; std::vector<int> p, a; std::vector<std::vector<int>> inp; std::vector<int> h; std::vector<int> power; std::vector<std::array<int, 2>> sum; std::vector<int> lazy; void dfs(int v) { for (int u : inp[v]) { h[u] = h[v] + 1; dfs(u); } } #define LC (2 * v) #define RC (2 * v + 1) #define mid ((l + r) / 2) void push(int v) { if (lazy[v] == 1) { std::swap(sum[v][0], sum[v][1]); } if (LC < 4 * m) { lazy[LC] ^= lazy[v]; } if (RC < 4 * m) { lazy[RC] ^= lazy[v]; } lazy[v] = 0; } void pull(int v) { push(v); push(LC); push(RC); sum[v][0] = (sum[LC][0] + sum[RC][0]) % mod; sum[v][1] = (sum[LC][1] + sum[RC][1]) % mod; } void add(int i, int t, int x, int v = 1, int l = 0, int r = m) { if (r - l == 1) { sum[v][t] = x; return; } if (i < mid) { add(i, t, x, LC, l, mid); } else { add(i, t, x, RC, mid, r); } pull(v); } void invert(int s, int e, int v = 1, int l = 0, int r = m) { push(v); if (s <= l && r <= e) { lazy[v] ^= 1; push(v); return; } if (s < mid) { invert(s, e, LC, l, mid); } if (e > mid) { invert(s, e, RC, mid, r); } pull(v); } void init(int N, int M, std::vector<int> P, std::vector<int> A) { n = N; m = M; p = P; a = A; inp.resize(n + m); for (int i = 1; i < n + m; i++) { inp[p[i]].push_back(i); } power.resize(2 * (n + m)); power[0] = 1; for (int i = 1; i < 2 * (n + m); i++) { power[i] = 2 * power[i - 1] % mod; } h.resize(n + m); dfs(0); sum.resize(4 * m); lazy.resize(4 * m); for (int i = 0; i < m; i++) { add(i, a[i], power[n - h[i + n]]); } } int count_ways(int L, int R) { invert(L - n, R - n + 1); return sum[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...