제출 #922971

#제출 시각아이디문제언어결과실행 시간메모리
922971thangdz2k7Digital Circuit (IOI22_circuit)C++17
100 / 100
863 ms46464 KiB
#include <bits/stdc++.h> #define pb push_back using namespace std; const int maxN = 2e5 + 5; const int mod = 1000002022; void add(int &a, int b){ a += b; if (a >= mod) a -= mod; if (a < 0) a += mod; } vector <int> adj[maxN], pre[maxN], suf[maxN]; int val[maxN], sz[maxN], dp[maxN]; void dfs(int u){ sz[u] = adj[u].size(); dp[u] = max(sz[u], 1); for (int i = 0; i < sz[u]; ++ i){ int v = adj[u][i]; dfs(v); if (!i) pre[u].pb(dp[v]); else pre[u].pb(1ll * pre[u].back() * dp[v] % mod); suf[u].pb(0); dp[u] = 1ll * dp[u] * dp[v] % mod; } for (int i = sz[u] - 1; i >= 0; -- i){ int v = adj[u][i]; if (i == sz[u] - 1) suf[u][i] = dp[v]; else suf[u][i] = 1ll * suf[u][i + 1] * dp[v] % mod; } } void get(int u){ for (int i = 0; i < sz[u]; ++ i){ int v = adj[u][i]; val[v] = val[u]; if (i > 0) val[v] = 1ll * val[v] * pre[u][i - 1] % mod; if (i < sz[u] - 1) val[v] = 1ll * val[v] * suf[u][i + 1] % mod; get(v); } } int sum[2][4 * maxN]; bool used[maxN], rev[4 * maxN]; void mer(int s){ sum[0][s] = 0; sum[1][s] = 0; for (int i = 0; i <= 1; ++ i){ for (int j = 2 * s; j <= 2 * s + 1; ++ j) add(sum[i][s], sum[i][j]); } } void build(int s, int l, int r, int n){ rev[s] = 0; if (l == r){ sum[0][s] = used[l] * val[l + n]; sum[1][s] = (1 ^ used[l]) * val[l + n]; return; } int mid = (l + r) / 2; build(2 * s, l, mid, n); build(2 * s + 1, mid + 1, r, n); mer(s); } int kk, gg; void init(int N, int M, std::vector<int> P, std::vector<int> A){ kk = N; gg = M; for (int i = 1; i < N + M; ++ i) adj[P[i]].pb(i); dfs(0); val[0] = 1; get(0); for (int i = 0; i < M; ++ i) used[i] = A[i]; build(1, 0, M - 1, N); } void down(int s){ if (!rev[s]) return; for (int i = 2 * s; i <= 2 * s + 1; ++ i) { rev[i] ^= 1; swap(sum[0][i], sum[1][i]); } rev[s] = 0; } void upd(int s, int l, int r, int u, int v){ if (u <= l && r <= v){ rev[s] ^= 1; swap(sum[0][s], sum[1][s]); return; } int mid = (l + r) / 2; down(s); if (mid >= u) upd(2 * s, l, mid, u, v); if (mid + 1 <= v) upd(2 * s + 1, mid + 1, r, u, v); mer(s); } int count_ways(int L, int R){ upd(1, 0, gg - 1, L - kk, R - kk); return sum[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...