50pts求助!
查看原帖
50pts求助!
398047
取名真难!楼主2024/7/24 20:27
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<ctime> 
#include<queue>
#include<map>
#define ull unsigned long long
using namespace std;
int n,m,a,c,cnt;
int head[100005],top[100005],fa[100005],dep[100005],siz[100005],son[100005],id[100005],di[100005];
long long w[100005],b;
struct node{
	int to,net;
}bian[200005];
struct str{
	int l,r;
	long long ans,lazy;
}s[400005];
void add(int u,int v){
	cnt++;
	bian[cnt].to=v;
	bian[cnt].net=head[u];
	head[u]=cnt;
	return;
}
void Dfs(int u){
	dep[u]=dep[fa[u]]+1;
	siz[u]=1;
	for(int i=head[u];i;i=bian[i].net){
		int v=bian[i].to;
		if(v==fa[u]) continue;
		fa[v]=u;
		Dfs(v);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v;
	}
	return;
}
void dfs(int u,int f){
	cnt++;
	id[u]=cnt;
	di[cnt]=u;
	top[u]=f;
	if(!son[u]) return;
	dfs(son[u],f);
	for(int i=head[u];i;i=bian[i].net){
		int v=bian[i].to;
		if(v==son[u]||v==fa[u]) continue;
		dfs(v,v);
	}
	return;
}
void build(int l,int r,int now){
	s[now].l=l;s[now].r=r;s[now].lazy=0;
	if(l==r){
		s[now].ans=w[di[l]];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,now<<1);
	build(mid+1,r,now<<1|1);
	s[now].ans=s[now<<1].ans+s[now<<1|1].ans;
	return;
}
void lazy(int now){
	if(s[now].lazy==0) return;
	int z=now<<1,y=now<<1|1;
	s[z].lazy+=s[now].lazy;
	s[z].ans+=s[now].lazy*(s[z].r-s[z].l+1);
	s[y].lazy+=s[now].lazy;
	s[y].ans+=s[now].lazy*(s[y].r-s[y].l+1);
	s[now].lazy=0;
	return;
}
void update(int x,int y,int z,int now){
	if(x<=s[now].l&&s[now].r<=y){
		s[now].lazy+=z;
		s[now].ans+=(s[now].r-s[now].l+1)*z;
		return;
	}
	lazy(now);
	int mid=(s[now].l+s[now].r)>>1;
	if(x<=mid) update(x,y,z,now<<1);
	if(y>mid) update(x,y,z,now<<1|1);
	s[now].ans=s[now<<1].ans+s[now<<1|1].ans;
}
long long find(int x,int y,int now){
	if(x<=s[now].l&&s[now].r<=y) return s[now].ans;
	lazy(now);
	int mid=(s[now].l+s[now].r)>>1;
	long long sum=0;
	if(x<=mid) sum+=find(x,y,now<<1);
	if(y>mid) sum+=find(x,y,now<<1|1);
	return sum;
}
long long find1(int x,int y){
	long long sum=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		sum+=find(id[top[x]],id[x],1);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	sum+=find(id[x],id[y],1);
	return sum;
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout); 
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<n;i++){
		cin>>a>>b;
		add(a,b);
		add(b,a);
	}
	Dfs(1);
	cnt=0;
	dfs(1,1);
	build(1,n,1);
	while(m--){
		cin>>c;
		if(c==1){
			cin>>a>>b;
			update(id[a],id[a],b,1);
		}
		if(c==2){
			cin>>a>>b;
			update(id[a],id[a]+siz[a]-1,b,1);
		}
		if(c==3){
			cin>>a;
			cout<<find1(a,1)<<endl;
		}
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;                       
}
/*
*/

WA2,7,8,9,10五个点

2024/7/24 20:27
加载中...