/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 7ms 20.914 MiB
#2 Accepted 7ms 20.531 MiB
#3 Accepted 27ms 22.164 MiB
#4 Accepted 30ms 22.078 MiB
#5 Accepted 25ms 22.168 MiB
#6 Accepted 29ms 23.277 MiB
#7 Accepted 246ms 30.125 MiB
#8 Accepted 253ms 30.367 MiB
#9 Accepted 249ms 30.293 MiB
#10 Accepted 245ms 30.27 MiB
#11 Accepted 382ms 30.316 MiB
#12 Accepted 245ms 30.109 MiB
#13 Accepted 248ms 30.41 MiB
#14 Accepted 183ms 37.078 MiB
#15 Accepted 207ms 37.164 MiB
#16 Accepted 209ms 37.121 MiB

Code

#ifndef LOCAL
#include <bits/stdc++.h>
#define debug(...)
#endif

using namespace std;
#define int long long
#define cinv(v) for (auto &it:v) cin>>it;
#define coutv(v) for (auto &it:v) cout<< it<<' '; cout<<'\n';

const int N = 2e5 + 5;
vector<int> tree(4 * N), lazy(4 * N), adj[N];
int n, q, arr[N], tin[N], tout[N], timer = 0;

void propagate(int node, int l, int r) {
    if (lazy[node] == 0) return;
    tree[node] = r - l + 1 - tree[node];
    if (l != r) {
        lazy[node * 2] = (lazy[node * 2] + lazy[node]) % 2;
        lazy[node * 2 + 1] = (lazy[node * 2 + 1] + lazy[node]) % 2;
    }
    lazy[node] = 0;
}

void update(int node, int start, int end, int l, int r) {
    propagate(node, start, end);
    if (start > r || end < l) return;
    if (start >= l && end <= r) {
        lazy[node] = (lazy[node] + 1) % 2;
        propagate(node, start, end);
        return;
    }
    int mid = (start + end) / 2;
    update(node * 2, start, mid, l, r);
    update(node * 2 + 1, mid + 1, end, l, r);
    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

int query(int node, int start, int end, int l, int r) {
    propagate(node, start, end);
    if (start > r || end < l) return 0;
    if (start >= l && end <= r) return tree[node];
    int mid = (start + end) / 2;
    int q1 = query(node * 2, start, mid, l, r);
    int q2 = query(node * 2 + 1, mid + 1, end, l, r);
    return q1 + q2;
}

void euler_tour(int now, int par) {
    tin[now] = ++timer;
    for (auto &it: adj[now]) {
        if (it == par) continue;
        euler_tour(it, now);
    }
    tout[now] = timer;
}

void shelby() {
    cin >> n;
    for (int i = 1; i <= n; ++i) cin >> arr[i];
    for (int i = 1; i < n; ++i) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    euler_tour(1, -1);
    for (int i = 1; i <= n; ++i) {
        if (arr[i]) update(1, 1, n, tin[i], tin[i]);
    }
    int q;
    cin >> q;
    while (q--) {
        int t, k;
        cin >> t >> k;
        if (t == 1) update(1, 1, n, tin[k], tout[k]);
        else cout << query(1, 1, n, tin[k], tout[k]) << '\n';
    }
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    // cin >> t;
    for (int _ = 1; _ <= t; ++_) {
        // cout << "Case " << _ << ": ";
        shelby();
    }
}

Information

Submit By
Type
Submission
Problem
P1101 Mr. Heart and the Enchanted Lights
Language
C++17 (G++ 13.2.0)
Submit At
2024-10-04 18:17:50
Judged At
2024-10-04 18:17:50
Judged By
Score
100
Total Time
382ms
Peak Memory
37.164 MiB