이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |