Submission #1185368

#TimeUsernameProblemLanguageResultExecution timeMemory
1185368anmattroiDigital Circuit (IOI22_circuit)C++17
100 / 100
322 ms22824 KiB
#include "circuit.h"
#include <bits/stdc++.h>
#define maxn 200005
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;

constexpr int mod = 1'000'002'022;

inline constexpr void add(int &x, const int &y) {x += y; if (x >= mod) x -= mod;}

int a[maxn], n, m;
vector<int> adj[maxn];
int s[maxn], contribution[maxn];

void pfsOne(int u) {
    s[u] = 1;
    for (int v : adj[u]) {
        pfsOne(v);
        s[u] = 1LL * s[u] * s[v] % mod;
    }
    if (u < n) s[u] = 1LL * s[u] * int(adj[u].size()) % mod;
}

void pfsTwo(int u) {

    int S = (u == 0 ? 1 : contribution[u]);

    for (int v : adj[u]) {
        contribution[v] = S;
        S = 1LL * S * s[v] % mod;
    }

    reverse(adj[u].begin(), adj[u].end());

    S = 1;
    for (int v : adj[u]) {
        contribution[v] = 1LL * contribution[v] * S % mod;
        S = 1LL * S * s[v] % mod;
    }

    for (int v : adj[u]) {
        pfsTwo(v);
    }

}

int sum[4*maxn], st[4*maxn], lz[4*maxn];

void apply(int r) {
    st[r] = (sum[r] - st[r] + mod) % mod;
    lz[r] ^= 1;
}

void down(int r) {
    if (lz[r]) {
        apply(r<<1);
        apply(r<<1|1);
        lz[r] = 0;
    }
}

void up(int r) {
    st[r] = (st[r<<1] + st[r<<1|1]) % mod;
}

void build(int r = 1, int lo = n, int hi = n+m-1) {
    if (lo == hi) {
        sum[r] = contribution[lo];
        st[r] = contribution[lo] * a[lo-n];
        return;
    }
    int mid = (lo + hi) >> 1;
    build(r<<1, lo, mid);
    build(r<<1|1, mid+1, hi);
    sum[r] = (sum[r<<1] + sum[r<<1|1]) % mod;
    st[r] = (st[r<<1] + st[r<<1|1]) % mod;
}

void update(int u, int v, int r = 1, int lo = n, int hi = n+m-1) {
    if (u <= lo && hi <= v) {
        apply(r);
        return;
    }
    down(r);
    int mid = (lo + hi) >> 1;
    if (u <= mid) update(u, v, r<<1, lo, mid);
    if (v > mid) update(u, v, r<<1|1, mid+1, hi);
    up(r);
}

void init(int N, int M, vector<int> P, vector<int> A) {
    n = N; m = M;
    for (int i = 1; i < N+M; i++) adj[P[i]].emplace_back(i);
    for (int i = 0; i < M; i++) a[i] = A[i];
    pfsOne(0); pfsTwo(0);
    build();
}

int count_ways(int L, int R) {
    update(L, R);
    return st[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...