제출 #1042904

#제출 시각아이디문제언어결과실행 시간메모리
1042904Alihan_8디지털 회로 (IOI22_circuit)C++17
46 / 100
3074 ms4184 KiB
#include "circuit.h" #include <vector> #include <bits/stdc++.h> using namespace std; #define ar array #define pb push_back #define ln '\n' const int Mod = 1000002022; vector <int> a; vector <vector<int>> adj; vector <int> dp; int n, m; template <class F, class S> void add(F &x, const S &y){ x = (x + 0LL + y) % Mod; if ( x < 0 ) x += Mod; } void init(int N, int M, std::vector<int> P, std::vector<int> A) { a = A, n = N, m = M; adj.resize(n + m); for ( int i = 1; i < n + m; i++ ){ adj[P[i]].pb(i); } vector <int> s(n + m); auto trav = [&](auto trav, int u) -> void{ if ( u >= n ){ s[u] = 1; return; } s[u] = adj[u].size(); for ( auto &v: adj[u] ){ trav(trav, v); s[u] = s[u] * 1LL * s[v] % Mod; } }; trav(trav, 0); dp.resize(m); auto dfs = [&](auto dfs, int u, int cnt) -> void{ if ( u >= n ){ dp[u - n] = cnt; return; } int sz = adj[u].size(); vector <int> child, vl; for ( auto &v: adj[u] ){ child.pb(v); vl.pb(s[v]); } vector <int> pf(sz + 1, 1), sf(sz + 2, 1); for ( int i = 0; i < sz; i++ ){ pf[i + 1] = pf[i] * 1LL * vl[i] % Mod; } for ( int i = sz; i > 0; i-- ){ sf[i] = sf[i + 1] * 1LL * vl[i - 1] % Mod; } for ( int i = 0; i < sz; i++ ){ int nxt = cnt * 1LL * pf[i] % Mod * sf[i + 2] % Mod; dfs(dfs, child[i], nxt); } }; dfs(dfs, 0, 1); } int count_ways(int L, int R) { L -= n, R -= n; int cnt = 0; for ( int i = L; i <= R; i++ ){ a[i] ^= 1; } for ( int i = 0; i < m; i++ ){ add(cnt, a[i] * dp[i]); } return cnt; }
#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...