RE on 3求助
查看原帖
RE on 3求助
675208
coder2009楼主2025/2/8 15:49

提示是在 query的if (l <= t[u].l && t[u].r <= r)那里越界了

#include <bits/stdc++.h>

using namespace std;
const int maxn = 2e5 + 5;
#define ls u << 1
#define rs u << 1 | 1

struct edge {
    int to, next;
} g[maxn << 1];
struct node {
    int l, r, val[2];
} t[maxn << 2];
struct ASK {
    int x, y, k;
} q[maxn];
int cnt, tot = 0;
int head[maxn], a[maxn], b[maxn], son[maxn], dfn[maxn], fa[maxn], dep[maxn], siz[maxn], f[maxn];

void add(int u, int v) {
    g[++tot].to = v;
    g[tot].next = head[u];
    head[u] = tot;
}

void push_up(int u) {
    t[u].val[0] = t[ls].val[0] + t[rs].val[0];
    t[u].val[1] = t[ls].val[1] + t[rs].val[1];
}

void build(int u, int l, int r) {
    t[u].l = l;
    t[u].r = r;
    if (l == r) {
        t[u].val[0] = b[l] > 0 ? 1 : 0;
        t[u].val[1] = b[l] < 0 ? -1 : 0;
        return;
    }
    int mid = (l + r) >> 1;
    build(ls, l, mid);
    build(rs, mid + 1, r);
    push_up(u);
}

int query(int u, int l, int r, int opt) {
    if (l <= t[u].l && t[u].r <= r) {
        return t[u].val[opt];
    } else {
        int mid = (t[u].l + t[u].r) >> 1;
        int s = 0;
        if (l <= mid) {
            s += query(ls, l, r, opt);
        }
        if (r > mid) {
            s += query(rs, l, r, opt);
        }
        return s;
    }
}

void dfs1(int u, int father, int depth) {
    dep[u] = depth;
    fa[u] = father;
    siz[u] = 1;
    for (int i = head[u]; i; i = g[i].next) {
        int v = g[i].to;
        if (v == father) {
            continue;
        }
        dfs1(v, u, depth + 1);
        siz[u] += siz[v];
        if (siz[v] > siz[son[u]]) {
            son[u] = v;
        }
    }
}

void dfs2(int u, int s) {
    dfn[u] = ++cnt;
    b[cnt] = a[u];
    f[u] = s;
    if (!son[u]) {
        return;
    }
    dfs2(son[u], s);
    for (int i = head[u]; i; i = g[i].next) {
        int v = g[i].to;
        if (v == fa[u] || v == son[u]) {
            continue;
        }
        dfs2(v, v);
    }
}

int ask(int x, int y, int opt) {
    int ans = 0;
    while (f[x] != f[y]) {
        if (dep[f[x]] < dep[f[y]]) {
            swap(x, y);
        }
        ans += query(1, dfn[f[x]], dfn[x], opt);
        x = fa[f[x]];

    }
    if (dep[x] > dep[y]) {
        swap(x, y);
    }
    ans += query(1, dfn[x], dfn[y], opt);
    return ans;
}

void init(int n) {
    for (int i = 1; i <= n + 2; ++i) {
        a[i] = 0;
        b[i] = 0;
        son[i] = 0;
        dfn[i] = 0;
        fa[i] = 0;
        dep[i] = 0;
        siz[i] = 0;
        f[i] = 0;
        head[i] = 0;
    }
    tot = 0;
}

void best_coder() {
    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        tot = 1;
        a[1] = 1;
        int num = 1, m = 0;
        for (int i = 1; i <= n; ++i) {
            char opt;
            int x, y;
            cin >> opt >> x >> y;
            if (opt == '+') {
                add(x, ++num);
                a[num] = y;
            } else {
                q[++m].x = x;
                q[m].y = y;
                cin >> q[m].k;
            }
        }
        dfs1(1, 0, 1);
        dfs2(1, 1);
        build(1, 1, num);
        for (int i = 1; i <= m; ++i) {
            int mx = ask(q[i].x, q[i].y, 0);
            int mn = ask(q[i].x, q[i].y, 1);
            cout << (q[i].k >= mn && q[i].k <= mx ? "YES\n" : "NO\n");
        }
        init(num);
    }
}
2025/2/8 15:49
加载中...