Submission #786376

#TimeUsernameProblemLanguageResultExecution timeMemory
786376vjudge1Digital Circuit (IOI22_circuit)C++17
0 / 100
3068 ms3668 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; constexpr int mod = 1000002022; int N, M; vector<int> P, A; vector<vector<int>> ch; int add(int a, int b) { int c = a + b; if (c >= mod) { c -= mod; } return c; } int mul(int a, int b) { return 1LL * a * b % mod; } int sub(int a, int b) { int c = a - b; if (c < 0) { c += mod; } return c; } void init(int n, int m, vector<int> p, vector<int> a) { N = n, M = m; P = p, A = a; ch.resize(N); for (int i = 1; i < N + M; i++) { ch[P[i]].push_back(i); } } int count_ways(int L, int R) { for (int i = L; i <= R; i++) { A[i] ^= 1; } vector<int> tot(N + M), on(N + M), off(N + M); for (int i = N + M - 1; i >= 0; i--) { if (i >= N) { tot[i] = 1; if (A[i] == 0) { off[i] = 1; } else { on[i] = 1; } } else { int x = ch[i][0]; int y = ch[i][1]; tot[i] = mul(3, mul(tot[x], tot[y])); on[i] = add(mul(off[x], off[y]), add(mul(2, add(mul(on[x], off[y]), mul(off[x], on[y]))), mul(3, mul(on[x], on[y])))); off[i] = sub(tot[i], on[i]); } } return on[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...