Submission #705509

#TimeUsernameProblemLanguageResultExecution timeMemory
705509danikoynov디지털 회로 (IOI22_circuit)C++17
4 / 100
3071 ms11944 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 update_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; } 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 solve_state(int v) { for (int u : children[v]) { solve_state(u); } update_state(v); } ll pw[maxn]; int act = 0, logM = 0; void init(int N, int M, std::vector<int> P, std::vector<int> A) { n = N; m = M; pw[0] = 1; for (int i = 1; i <= M; i ++) pw[i] = (pw[i - 1] * (ll)(2)) % mod; while((1 << logM) < M) logM ++; for (int i = 0; i < N + M; i ++) p[i] = P[i]; for (int i = 0; i < M; i ++) a[i] = A[i], act += a[i]; for (int i = 1; i < N + M; i ++) { children[p[i]].push_back(i); } solve_state(0); } int tree[4 * maxn], lazy[4 * maxn]; int count_ways(int L, int R) { if (L == R) { act -= a[L - n]; a[L - n] = (a[L - n] + 1) % 2; act += a[L - n]; ll ans = (pw[n - logM] * act) % mod; return ans; } else { 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...