제출 #702659

#제출 시각아이디문제언어결과실행 시간메모리
702659boris_mihov디지털 회로 (IOI22_circuit)C++17
18 / 100
3059 ms7948 KiB
#include "circuit.h" #include <algorithm> #include <iostream> #include <numeric> #include <vector> typedef long long llong; const int MAXN = 200000 + 10; const int MOD = 1000002022; const int INF = 1e9; int n, m; llong w[MAXN]; llong b[MAXN]; llong pw[MAXN]; std::vector <int> g[MAXN]; void init(int N, int M, std::vector <int> P, std::vector <int> A) { n = N; m = M; for (int i = 1 ; i < n + m ; ++i) { g[P[i] + 1].push_back(i + 1); } for (int i = n + 1 ; i <= n + m ; ++i) { if (A[i - n - 1] == 0) { w[i] = 1; b[i] = 0; } else { b[i] = 1; w[i] = 0; } } } void dfs(int node) { if (g[node].empty()) { pw[node] = 1; return; } b[node] = 0; llong sum = 1; pw[node] = g[node].size(); for (const int &i : g[node]) { dfs(i); b[node] = (w[i] * b[node] + b[i] * (b[node] + sum)) % MOD; sum = (w[i] + b[i]) * sum; sum %= MOD; pw[node] *= pw[i]; pw[node] %= MOD; } w[node] = pw[node] - b[node]; if (w[node] < 0) w[node] += MOD; } int count_ways(int L, int R) { L++; R++; for (int i = L ; i <= R ; ++i) { std::swap(b[i], w[i]); } dfs(1); return b[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...