제출 #627581

#제출 시각아이디문제언어결과실행 시간메모리
627581ash7728디지털 회로 (IOI22_circuit)C++17
18 / 100
3021 ms4952 KiB
#include "circuit.h" #include <bits/stdc++.h> #define N 100020 #define f first #define s second #define pb push_back #define mp make_pair #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() using namespace std; const int mod = 1000002022; int yes[N], no[N], state[N],pai[N], n,m; vector<int> grafo[N]; void multiply(vector<int>& poly, int x){ if(poly.empty()){ poly = {no[x], yes[x]}; return; } vector<int> ans; for(int i = 0; i < sz(poly); i++){ int A = (1LL*poly[i]*no[x])%mod; int B = 0; if(i >= 1) B = (1LL*poly[i-1]*yes[x])%mod; ans.pb((A+B)%mod); } ans.pb( (1LL*poly.back()*yes[x])%mod); poly = ans; } void solve(int x){ yes[x] = no[x] = 0; if(x >= n){ yes[x] = state[x]; no[x] = (1-state[x]); return; } vector<int> poly; for(auto v: grafo[x]){ solve(v); multiply(poly, v); } vector<int> pref; for(int i = 0; i < sz(poly); i++){ pref.pb( (pref.empty()?0:pref.back()) + poly[i]); pref.back() %= mod; } for(int p = 1; p <= sz(grafo[x]); p++){ yes[x] += (pref.back() - pref[p-1] + mod)%mod; no[x] += (pref[p-1] + mod)%mod; no[x] %= mod; yes[x] %= mod; } } void init(int n_, int m_, vector<int> P, vector<int> A) { n = n_, m = m_; for(int i = 1; i < n+m; i++){ grafo[P[i]].pb(i); pai[i] = P[i]; } for(int i = 0;i<m;i++) state[i+n] = A[i]; } int count_ways(int L, int R) { for(int i = L; i <= R; i++) state[i] ^= 1; solve(0); return yes[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...