제출 #1167354

#제출 시각아이디문제언어결과실행 시간메모리
1167354SmuggingSpunDigital Circuit (IOI22_circuit)C++20
18 / 100
3082 ms7412 KiB
#include "circuit.h" #include<bits/stdc++.h> using namespace std; const int lim = 2e5 + 5; const int mod = 1000002022; void add(int& a, int b){ if((a += b) >= mod){ a -= mod; } } int n, m, a[lim]; vector<int>g[lim]; void init(int N, int M, vector<int>P, vector<int>A){ n = N; m = M; for(int i = n + m - 1; i > -1; i--){ g[P[i]].emplace_back(i); } for(int i = 0; i < m; i++){ a[i + n] = A[i]; } } int count_ways(int L, int R){ vector<int>dp_0(n + m, 0), dp_1(n + m, 0); for(int i = L; i <= R; i++){ a[i] ^= 1; } for(int i = n; i < n + m; i++){ dp_1[i] = (dp_0[i] = int(a[i] == 0)) ^ 1; } function<void(int)>dfs; dfs = [&] (int s){ vector<int>sum(g[s].size() + 1, 0); sum[0] = 1; for(int& d : g[s]){ if(d < n){ dfs(d); } for(int i = g[s].size(); i > 0; i--){ sum[i] = (1LL * sum[i] * dp_0[d] + 1LL * sum[i - 1] * dp_1[d]) % mod; } sum[0] = 1LL * sum[0] * dp_0[d] % mod; } for(int i = 0; i <= g[s].size(); i++){ add(dp_1[s], 1LL * sum[i] * i % mod); add(dp_0[s], 1LL * sum[i] * (int(g[s].size()) - i) % mod); } }; dfs(0); return dp_1[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...