Submission #825721

#TimeUsernameProblemLanguageResultExecution timeMemory
825721LittleCubeDigital Circuit (IOI22_circuit)C++17
2 / 100
3065 ms7952 KiB
#include "circuit.h" #include <bits/stdc++.h> #define ll long long using namespace std; const ll mod = 1'000'002'022; namespace { int N, M; vector<int> P, A, c; vector<int> child[200005]; ll zero[200005], one[200005]; } void init(int N, int M, vector<int> P, vector<int> A) { ::N = N; ::M = M; ::P = P; ::A = A; c.resize(N); for (int i = 1; i < N + M; i++) c[P[i]]++, child[P[i]].emplace_back(i); } int count_ways(int L, int R) { L -= N, R -= N; for (int i = L; i <= R; i++) A[i] ^= 1; for (int i = M - 1; i >= 0; i--) if(A[i] == 1) zero[N + i] = 0, one[N + i] = 1; else zero[N + i] = 1, one[N + i] = 0; for (int i = N - 1; i >= 0; i--) { int K = child[i].size(); vector<ll> dp(K + 1, 0); dp[0] = 1; for (auto j : child[i]) for (int k = K - 1; k >= 0; k--) { dp[k + 1] = (dp[k + 1] + dp[k] * one[j]) % mod; dp[k] = (dp[k] * zero[j]) % mod; } zero[i] = one[i] = 0; for (int k = 0; k <= K; k++) { zero[i] = (zero[i] + (K - k) * dp[k]); one[i] = (one[i] + k * dp[k]); } } return one[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...