树剖萌新,WA70+AC30,不知道错哪里,求指导
查看原帖
树剖萌新,WA70+AC30,不知道错哪里,求指导
103120
54Teddy楼主2021/1/24 01:38

有7个点WA了,不知道为啥,数据太大不好调

求指导,提交记录:wa*7+ac*3,马蜂怪异轻喷(

#include <iostream>
#include <stdio.h>
#define maxn 100005
#define ll long long
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
using namespace std;
int n, m;
ll a[maxn];
struct edge {
	int to, nxt;
} e[maxn << 1];
int p[maxn], eid = 0;
void addedge (int u, int v) {
	e[++eid] = (edge){v, p[u]}, p[u] = eid;
	e[++eid] = (edge){u, p[v]}, p[v] = eid;
}
int f[maxn], siz[maxn], d[maxn], son[maxn], top[maxn], id[maxn], rk[maxn];
void dfs (int u, int fa) {
	siz[u] = 1;
	for (int i = p[u]; i; i = e[i].nxt) {
		int to = e[i].to;
		if (to == fa) continue;
		d[to] = d[u] + 1, f[to] = u;
		dfs (to, u);
		siz[u] += siz[to];
		if (siz[to] > siz[son[u]]) son[u] = to;
	}
}
int cnt = 0;
void dfs2 (int u, int tp) {
	top[u] = tp, id[u] = ++cnt, rk[cnt] = u;
	if (!son[u]) return ;
	dfs2 (son[u], tp);
	for (int i = p[u]; i; i = e[i].nxt) {
		int to = e[i].to;
		if (to == f[u] || to == son[u]) continue;
		dfs2 (to, to);
	}
}
ll sum[maxn << 2], add[maxn << 2];
void pushup (int rt) {
	sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void pushdown (int rt, int l, int r, int mid) {
	if (add[rt]) {
		sum[rt<<1] += add[rt] * (mid-l+1), add[rt<<1] += add[rt];
		sum[rt<<1|1] += add[rt] * (r-mid), add[rt<<1|1] += add[rt];
		add[rt] = 0; 
	}
	return ;
}
void build (int l, int r, int rt) {
	if (l == r) {
		sum[rt] = a[rk[l]], add[rt] = 0;
		return ;
	}
	int mid = l + r >> 1;
	build (ls), build(rs);
	pushup (rt);
}
void update (int l, int r, int rt, int L, int R, ll x) {
	if (L <= l && r <= R) {
		sum[rt] += (r-l+1) * x, add[rt] += x;
		return ; 
	}
	int mid = l + r >> 1;
	pushdown (rt, l, r, mid);
	if (mid >= L) update (ls, L, R, x);
	if (mid < R) update (rs, L, R, x);
	pushup (rt);
}
ll query (int l, int r, int rt, int L, int R) {
	if (L <= l && r <= R) {
		return sum[rt];
	}
	int mid = l + r >> 1; ll res = 0;
	pushdown (rt, l, r, mid);
	if (mid >= L) res += query (ls, L, R);
	if (mid < R) res += query (rs, L, R);
	return res;
}
//void updates (int u, int v, ll x) {
//	while (top[u] != top[v]) {
//		if (d[top[u]] < d[top[v]]) swap (u, v);
//		update (1, n, 1, id[top[u]], id[u], x);
//		u = f[top[u]];
//	}
//	if (id[u] > id[v]) swap (u, v);
//	update (1, n, 1, id[u], id[v], x);
//}
ll querys (int u, int v) {
	ll res = 0;
	while (top[u] != top[v]) {
		if (d[top[u]] < d[top[v]]) swap (u, v);
		res += query (1, n, 1, id[top[u]], id[u]);
		u = f[top[u]];
	}
	if (id[u] > id[v]) swap (u, v);
	return res + query (1, n, 1, id[u], id[v]);
}
int op, u; ll x;
int main () {
	scanf ("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) scanf ("%d", a+i);
	for (int i = 1, u, v; i < n; i++) {
		scanf ("%d %d", &u, &v);
		addedge (u, v);
	}
	dfs (1, 1);
	dfs2 (1, 1);
	build (1, n, 1);
	while (m--) {
		scanf ("%d %d", &op, &u);
		if (op == 1) {
			scanf ("%lld", &x);
			update (1, n, 1, id[u], id[u], x);
		} else if (op == 2) {
			scanf ("%lld", &x);
			update (1, n, 1, id[u], id[u] + siz[u] - 1, x);
		} else {
			printf ("%lld\n", querys (1, u));
		}
	}
	return 0;
}
2021/1/24 01:38
加载中...