Submission #1066914

#TimeUsernameProblemLanguageResultExecution timeMemory
1066914j_vdd16Digital Circuit (IOI22_circuit)C++17
0 / 100
3003 ms3416 KiB
#include "circuit.h" #include <algorithm> #include <bitset> #include <cstdint> #include <cstring> #include <iostream> #include <limits.h> #include <math.h> #include <map> #include <numeric> #include <queue> #include <set> #include <stack> #include <string> #include <vector> #define int long long #define loop(X, N) for(int X = 0; X < (N); X++) #define all(V) V.begin(), V.end() #define rall(V) V.rbegin(), V.rend() using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> ii; typedef vector<ii> vii; typedef vector<vector<ii>> vvii; typedef vector<bool> vb; typedef vector<vector<bool>> vvb; int n, m; vvi children; vector<signed> assignment; vi c; constexpr int mod = 1e9 + 7; int dfs(int node) { //a if (node >= n) { return { assignment[node - n] }; } vii counts; //c, a for (int child : children[node]) { int res = dfs(child); counts.push_back({c[child], res}); } return (counts[0].first * counts[1].second + counts[0].second * counts[1].first) % mod; } void cDfs(int node) { if (node >= n) { c[node] = 1; return; } c[node] = children[node].size(); for (int child : children[node]) { cDfs(child); c[node] *= c[child]; } } void init(signed N, signed M, std::vector<signed> P, std::vector<signed> A) { n = N; m = M; children = vvi(n); assignment = A; c = vi(n + m); for (int i = 1; i < n + m; i++) { children[P[i]].push_back(i); } cDfs(0); } signed count_ways(signed L, signed R) { for (int i = L; i <= R; i++) { assignment[i - n] ^= 1; } return dfs(0); /* 3 children: a = 1 * (a[0] * b[1] * b[2] + b[0] * a[1] * b[2] + b[0] * b[1] * a[2]) + 2 * (a[0] * a[1] * b[2] + a[0] * b[1] * a[2] + b[0] * a[1] * a[2]) + 3 * (a[0] * a[1] * a[2]) = 1 * (a[0] * (c[1] - a[1]) * (c[2] - a[2])) 2 * (a[0] * a[1] * (c[2] - a[2])) 3 * (a[0] * a[1] * a[2]) = (1 + 2 - 3) * (a[0] * a[1] * a[2]) a[0] * c[1] * c[2] 2 * (a[0] * a[1] * c[2]) - 2 * (a[0] * a[1] * c[2]) C = c[0] * c[1] * c[2] * 3 b = C - a = 2 children: a = 1 * (a[0] * b[1] + b[0] * a[1]) + 2 * (a[0] * a[1]) = 1 * (a[0] * (c[1] - a[1]) + (c[0] - a[0]) * a[1]) + 2 * (a[0] * a[1]) = a[0] * c[1] + c[0] * a[1] C = c[0] * c[1] * 2 b = C - a = */ //return 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...