求助哪里UB

P3833 [SHOI2012] 魔法树

@[_Revenge_](/user/750803) 字符串读入。
by XHY20180718 @ 2023-01-10 07:20:31


@[_Revenge_](/user/750803) ```cpp #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(); while(opt==' '||opt=='\n')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; } ```
by XHY20180718 @ 2023-01-10 07:23:09


@[_Revenge_](/user/750803) getchar两次。第一次吃掉换行符,第二次才能读进op。 ```cpp getchar(); char op = getchar(); ``` 然后就过了。
by liangbowen @ 2023-01-10 08:09:51


@[liangbowen](/user/367488) 谢谢
by _Revenge_ @ 2023-01-10 10:14:56


@[xiehuiying](/user/399475) 谢谢
by _Revenge_ @ 2023-01-10 10:15:12


|