제출 #705503

#제출 시각아이디문제언어결과실행 시간메모리
705503danikoynov디지털 회로 (IOI22_circuit)C++17
18 / 100
3086 ms7812 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 1000002022; const int maxn = 2e5 + 10; int n, m, p[maxn], a[maxn]; vector < int > children[maxn]; ll dp[maxn][2], temp[maxn]; void solve_state(int v) { dp[v][0] = dp[v][1] = 0; if (v >= n) { dp[v][1] = a[v - n]; dp[v][0] = 1 - dp[v][1]; return; } for (int u : children[v]) { solve_state(u); } int c = children[v].size(); for (int i = 0; i <= c; i ++) temp[i] = 0; temp[0] = 1; for (int u : children[v]) { for (int i = c; i >= 0; i --) { temp[i] = (temp[i] * dp[u][0]) % mod; if (i > 0) temp[i] = (temp[i] + temp[i - 1] * dp[u][1]) % mod; } } for (int i = 0; i <= c; i ++) { dp[v][0] = (dp[v][0] + temp[i] * (ll)(c - i)) % mod; dp[v][1] = (dp[v][1] + temp[i] * (ll)(i)) % mod; } ///cout << v << " " << dp[v][0] << " " << dp[v][1] << endl; } void init(int N, int M, std::vector<int> P, std::vector<int> A) { n = N; m = M; for (int i = 0; i < N + M; i ++) p[i] = P[i]; for (int i = 0; i < M; i ++) a[i] = A[i]; for (int i = 1; i < N + M; i ++) { children[p[i]].push_back(i); } } int count_ways(int L, int R) { for (int i = L - n; i <= R - n; i ++) a[i] = ((a[i] + 1) & 1); solve_state(0); return dp[0][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...