求助哪里UB
查看原帖
求助哪里UB
750803
_Revenge_楼主2023/1/9 23:35

VSC 样例能过 LG IDE 不能

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db;

const int N = 4e5 + 50;
const int M = 1e5 + 50;
const int Mod = 1e9 + 7;

#define int long long

inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}

struct node
{
    int to, nxt;
} e[N];

int head[N], cnt;

void add_edge(int u, int v)
{
    ++cnt;
    e[cnt].to = v;
    e[cnt].nxt = head[u];
    head[u] = cnt;
}

int top[N], id[N], fa[N], son[N], siz[N], dep[N], res;

void dfs1(int u, int p)
{
    dep[u] = dep[p] + 1;
    siz[u] = 1;
    fa[u] = p;
    int maxn = -1;
    for (int i = head[u]; i; i = e[i].nxt)
    {
        int v = e[i].to;
        if (v == p)
            continue;
        dfs1(v, u);
        siz[u] += siz[v];
        if (siz[v] > maxn)
            maxn = siz[v], son[u] = v;
    }
}

void dfs2(int u, int topf)
{
    top[u] = topf;
    id[u] = ++res;
    if (!son[u])
        return;
    dfs2(son[u], topf);
    for (int i = head[u]; i; i = e[i].nxt)
    {
        int v = e[i].to;
        if (v == fa[u] || v == son[u])
            continue;
        dfs2(v, v);
    }
}

int n, m;

int tree[N], lazy[N];

int ls(int p) { return p << 1; }
int rs(int p) { return p << 1 | 1; }
void push_up(int p)
{
    tree[p] = tree[ls(p)] + tree[rs(p)];
}

void change(int p, int l, int r, int k)
{
    lazy[p] += k;
    tree[p] += (r - l + 1) * k;
}

void push_down(int p, int l, int r)
{
    int mid = l + r >> 1;
    change(ls(p), l, mid, lazy[p]);
    change(rs(p), mid + 1, r, lazy[p]);
    lazy[p] = 0;
}

void update(int nx, int ny, int l, int r, int p, int k)
{
    if (nx <= l && r <= ny)
    {
        change(p, l, r, k);
        return;
    }
    push_down(p, l, r);
    int mid = l + r >> 1;
    if (nx <= mid)
        update(nx, ny, l, mid, ls(p), k);
    if (ny > mid)
        update(nx, ny, mid + 1, r, rs(p), k);
    push_up(p);
}

int query(int nx, int ny, int l, int r, int p)
{
    int res = 0;
    if (nx <= l && r <= ny)
        return tree[p];
    push_down(p, l, r);
    int mid = l + r >> 1;
    if (nx <= mid)
        res += query(nx, ny, l, mid, ls(p));
    if (ny > mid)
        res += query(nx, ny, mid + 1, r, rs(p));
    return res;
}

void update_range(int x, int y, int k)
{
    while (top[x] != top[y])
    {
        if (dep[top[x]] < dep[top[y]])
            swap(x, y);
        update(id[top[x]], id[x], 1, n, 1, k);
        x = fa[top[x]];
    }
    if (dep[x] > dep[y])
        swap(x, y);
    update(id[x], id[y], 1, n, 1, k);
}

int query_tree(int x)
{
    return query(id[x], id[x] + siz[x] - 1, 1, n, 1);
}

signed main()
{
    n = read();
    for (int i = 1; i < n; ++i)
    {
        int u = read() + 1, v = read() + 1;
        add_edge(u, v);
        add_edge(v, u);
    }
    dfs1(1, 0);
    dfs2(1, 1);
    m = read();
    while (m--)
    {
        char opt = getchar();
        int u, v, d;
        if (opt == 'A')
        {
            u = read() + 1, v = read() + 1, d = read();
            update_range(u, v, d);
        }
        else
        {
            u = read() + 1;
            printf("%lld\n", query_tree(u));
        }
    }
    return 0;
}
2023/1/9 23:35
加载中...