刚学 OI 1s 的萌新求条树剖
查看原帖
刚学 OI 1s 的萌新求条树剖
813622
Igallta楼主2024/5/20 19:29

样例过了,全 WA 求条

#include<bits/stdc++.h>
#define LL k<<1
#define RR k<<1|1
#define int long long
using namespace std;
const int N = 1e6 + 1;
int d[N], siz[N], l[N], a[N], fa[N], son[N], tot, top[N],n,ToT;
vector<int>vec[N];
struct rush_E {
	int l, r, sum, lazy;
} t[4 * N + 1];
void dfs1(int u) {
	siz[u] = 1;
	for (auto v : vec[u]) {
		if (v != fa[u]) {
			fa[v] = u;
			d[v] = d[u] + 1;
			dfs1(v);
			siz[u] += siz[v];
			if (siz[v] > siz[son[u]]) {
				son[u] = v;
			}
		}
	}
}
void dfs2(int u, int t) {
	l[u] = ++tot;
	top[u] = t;
	if (son[u])dfs2(son[u], t);
	for (auto v : vec[u]) {
		if (v != fa[u] && v != son[u]) {
			dfs2(v, v);
		}
	}
}
void pushup(int k) {
	t[k].sum = (t[LL].sum + t[RR].sum);
}
void pushdown(int k) {
	if (t[k].lazy) {
		int l = t[k].l, r = t[k].r;
		int mid = l + r >> 1;
		t[LL].lazy += t[k].lazy;
		t[RR].lazy += t[k].lazy;
		t[LL].sum += ((mid - l + 1) * t[k].lazy);
		t[RR].sum += ((r - mid) * t[k].lazy);
		t[k].lazy = 0;
	}
}
void build(int k, int l, int r) {
	t[k].l = l;
	t[k].r = r;
	if (l == r) {
		return;
	}
	int mid = l + r >> 1;
	build(LL, l, mid);
	build(RR, mid + 1, r);
}
int qsum(int k, int l, int r) {
	if (t[k].l >= l && t[k].r <= r) {
		return t[k].sum;
	}
	int ans=0,mid=t[k].l+t[k].r>>1;
	pushdown(k);
	if(l<=mid){
		ans+=qsum(LL,l,mid);
	}
	if(r>mid){
		ans+=qsum(RR,mid+1,r);
	}
	return ans;
}
void update(int k,int l,int r,int v){
	if(t[k].l>=l&&t[k].r<=r){
		t[k].lazy+=v;
		t[k].sum+=((t[k].r-t[k].l+1)*v);
		return;
	}
	int mid=t[k].l+t[k].r>>1;
	pushdown(k);
	if(l<=mid){
		update(LL,l,r,v);
	}
	if(r>mid){
		update(RR,l,r,v);
	}
	pushup(k);
}
void tup(int u,int v,int w){
	while(top[u] != top[v]){
		if(d[top[u]] < d[top[v]])swap(u,v);
		update(1,l[top[u]],l[u],w);
		u=fa[top[u]];
	}
	if(d[u] > d[v])swap(u,v);
	update(1,l[u],l[v],w);
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin>>n;
	for(int i=1;i<=n-1;i++){
		int u,v;
		cin>>u>>v;
		++u;
		++v;
		vec[u].push_back(v); 
		vec[v].push_back(u);
	}
	dfs1(1);
	dfs2(1,1);
	build(1,1,n);
	cin>>ToT; 
	while(ToT--){
		char c;
		int x,y,z;
		cin>>c>>x;
		++x;
		if(c=='Q'){
			cout<<qsum(1,l[x],l[x]+siz[x]-1)<<'\n';	
		} 
		if(c=='A'){
			cin>>y>>z;
			++y;
			tup(x,y,z);
		}
	}
	return 0;
}
2024/5/20 19:29
加载中...