제출 #798001

#제출 시각아이디문제언어결과실행 시간메모리
798001gesgha디지털 회로 (IOI22_circuit)C++17
18 / 100
3077 ms13300 KiB
#include "circuit.h" #include <bits/stdc++.h> #define fr(i, a, b) for(int i = a; i <= b; i++) #define rf(i, a, b) for(int i = a; i >= b; i--) #define fe(x, y) for (auto& x : y) #define fi first #define se second #define pb push_back #define all(x) x.begin(), x.end() #define pw(x) (1LL << (x)) #define sz(x) (int)x.size() using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; #define fbo find_by_order #define ook order_of_key template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template <typename T> using ve = vector <T>; template <typename T> bool umx (T& a, T b) { return a < b ? a = b, 1 : 0; } template <typename T> bool umn (T& a, T b) { return a > b ? a = b, 1 : 0; } using ll = long long; using ld = long double; using pll = pair <ll, ll>; using pii = pair <int, int>; using ull = unsigned long long; const int oo = 1e9; const ll OO = 1e18; const int N = 2e5 + 10; const int M = 5e3 + 100; const int mod = 1e9 + 2022; int a[N]; int dp[N][2]; int dp1[N][2]; bool rev[N]; ve <int> G[N]; void push(int v) { if(!rev[v]) return; fe (to, G[v]) { swap(dp1[to], dp[to]); rev[to] ^= 1; } rev[v] = 0; } int n, m; int add(int a, int b) { return a + b < mod ? a + b : a + b - mod; } int mul (int a, int b) { return 1LL * a * b % mod; } int tin[N]; int tout[N]; int tim; int mn[N]; int mx[N]; bool isupper(int u, int v) { return tin[u] <= tin[v] && tout[v] <= tout[u]; } void dfs(int u) { tin[u] = tim++; if (!sz(G[u])) { mn[u] = u; mx[u] = u; if(a[u]) { dp[u][0] = 0; dp[u][1] = 1; dp1[u][0] = 1; dp1[u][1] = 0; } else { dp[u][0] = 1; dp[u][1] = 0; dp1[u][1] = 1; dp1[u][0] = 0; } return; } for (auto to : G[u]) { dfs(to); mx[u] = max(mx[u], mx[to]); mn[u] = min(mn[u], mn[to]); } ve <ve <int>> d(sz(G[u]) + 1); ve <ve <int>> d1(sz(G[u]) + 1); fe (x, d) x.resize(sz(G[u]) + 1); fe (x, d1) x.resize(sz(G[u]) + 1); d[0][0] = 1; d1[0][0] = 1; for (int i = 0; i < sz(G[u]); i++) { int to = G[u][i]; for (int cnt_al = 0; cnt_al <= i; cnt_al++) { d[i + 1][cnt_al + 1] = add(d[i + 1][cnt_al + 1], mul(d[i][cnt_al], dp[to][1])); d[i + 1][cnt_al] = add(d[i + 1][cnt_al], mul(d[i][cnt_al], dp[to][0])); d1[i + 1][cnt_al + 1] = add(d[i + 1][cnt_al + 1], mul(d[i][cnt_al], dp[to][1])); d1[i + 1][cnt_al] = add(d[i + 1][cnt_al], mul(d[i][cnt_al], dp[to][0])); } } dp[u][0] = dp[u][1] = 0; for (int cnt_al = 0; cnt_al <= sz(G[u]); cnt_al++) { dp[u][1] = add(dp[u][1], mul(d[sz(G[u])][cnt_al], max(0, cnt_al))); dp[u][0] = add(dp[u][0], mul(d[sz(G[u])][cnt_al], sz(G[u]) - cnt_al)); } dp1[u][0] = dp1[u][1] = 0; for (int cnt_al = 0; cnt_al <= sz(G[u]); cnt_al++) { dp1[u][1] = add(dp1[u][1], mul(d1[sz(G[u])][cnt_al], max(0, cnt_al))); dp1[u][0] = add(dp1[u][0], mul(d1[sz(G[u])][cnt_al], sz(G[u]) - cnt_al)); } tout[u] = tim; } void calc(int u, int L, int R) { umx(L, mn[u]); umn(R, mx[u]); if (L > mx[u] || R < mn[u] || L > R) return; if (L == mn[u] && R == mx[u]) { rev[u] ^= 1; swap(dp[u], dp1[u]); return; } push(u); for (auto to : G[u]) calc(to, L, R); ve <ve <int>> d(sz(G[u]) + 1); ve <ve <int>> d1(sz(G[u]) + 1); fe (x, d) x.resize(sz(G[u]) + 1); fe (x, d1) x.resize(sz(G[u]) + 1); d[0][0] = 1; d1[0][0] = 1; for (int i = 0; i < sz(G[u]); i++) { int to = G[u][i]; for (int cnt_al = 0; cnt_al <= i; cnt_al++) { d[i + 1][cnt_al + 1] = add(d[i + 1][cnt_al + 1], mul(d[i][cnt_al], dp[to][1])); d[i + 1][cnt_al] = add(d[i + 1][cnt_al], mul(d[i][cnt_al], dp[to][0])); d1[i + 1][cnt_al + 1] = add(d[i + 1][cnt_al + 1], mul(d[i][cnt_al], dp[to][1])); d1[i + 1][cnt_al] = add(d[i + 1][cnt_al], mul(d[i][cnt_al], dp[to][0])); } } dp[u][0] = dp[u][1] = 0; for (int cnt_al = 0; cnt_al <= sz(G[u]); cnt_al++) { dp[u][1] = add(dp[u][1], mul(d[sz(G[u])][cnt_al], max(0, cnt_al))); dp[u][0] = add(dp[u][0], mul(d[sz(G[u])][cnt_al], sz(G[u]) - cnt_al)); } dp1[u][0] = dp1[u][1] = 0; for (int cnt_al = 0; cnt_al <= sz(G[u]); cnt_al++) { dp1[u][1] = add(dp1[u][1], mul(d1[sz(G[u])][cnt_al], max(0, cnt_al))); dp1[u][0] = add(dp1[u][0], mul(d1[sz(G[u])][cnt_al], sz(G[u]) - cnt_al)); } } void init(int N, int M, vector<int> P, vector<int> A) { n = N; m = M; for (int i = 0; i < M; i++) a[i + N] = A[i]; for (int i = 1; i < N + M; i++) G[P[i]].pb(i); dfs(0); } int count_ways(int L, int R) { if (n <= 1000) { for (int i = L; i <= R; i++) { a[i] = 1 - a[i]; } } if (__builtin_popcountll(m) == 1 && n == m - 1) { calc(0, L, R); } else dfs(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...