树上带修莫队 WA求调
查看原帖
树上带修莫队 WA求调
400593
wuyiduo楼主2023/1/4 20:59
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100010;
struct Q{
	int u,v,t,id;
}q[N];
struct M{
	int next,last,u;
}c[N];
int tp,type,n,m,qq,val[N],w[N],col[N],str[N],top[N],fa[N],son[N],siz[N],dep[N],cntc,cntq,be[N],block,idx,num[N],tim;
bool vis[N];
ll res,ans[N];
vector<int> e[N];
void dfs1(int u,int f){
	int bt=tp;
	str[++tp]=u;
	fa[u]=f;
	siz[u]=1;
	dep[u]=dep[f]+1;
	int mx=-1;
	for(int v:e[u]){
		if(v==f) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(tp-bt>block){
			++idx;
			while(tp>bt) be[str[tp--]]=idx;
		}
		if(siz[v]>mx){
			mx=siz[v];
			son[u]=v;
		}
	}
}
void dfs2(int u,int t){
	top[u]=t;
	if(!son[u]) return;
	dfs2(son[u],t);
	for(int v:e[u]){
		if(v==fa[u]||v==son[u]) continue;
		dfs2(v,v);
	}
}
int lca(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]) swap(x,y);
		y=fa[top[y]];
	}
	return dep[x]<dep[y]?x:y;
}
bool cmp(Q x,Q y){
	if(be[x.u]!=be[y.u]) return be[x.u]<be[y.u];
	if(be[x.v]!=be[y.v]) return be[x.v]<be[y.v];
	return x.t<y.t;
}
void add(int x){
	++num[x];
	res+=(ll)w[num[x]]*val[x];
}
void del(int x){
	res-=(ll)w[num[x]]*val[x];
	--num[x];
}
void updata(int x){
	if(vis[x]){
		del(col[x]);
		vis[x]=0;
	}
	else{
		add(col[x]);
		vis[x]=1;
	}
}
void modify(int x,int y){
	if(vis[x]){
		del(col[x]);
		add(y);
	}
	col[x]=y;
}
void move(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y]){
		updata(x);
		x=fa[x];
	}
	while(x!=y){
		updata(x);updata(y);
		x=fa[x];y=fa[y];
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&qq);
	block=pow(n,2.0/3);
	for(int i=1;i<=m;i++) scanf("%d",&val[i]);
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	for(int i=1,u,v;i<n;i++){
		scanf("%d%d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&col[i]);
		str[i]=col[i];
	}
	for(int i=1,x,y;i<=qq;i++){
		scanf("%d%d%d",&type,&x,&y);
		if(type==0){
			++cntc;
			c[cntc].u=x;
			c[cntc].last=str[x];
			c[cntc].next=y;
			str[x]=y;
		}
		else{
			++cntq;
			q[cntq].u=x;
			q[cntq].v=y;
			q[cntq].t=cntc;
			q[cntq].id=cntq;
		}
	}
	memset(str,0,sizeof(str));
	dfs1(1,0);
	dfs2(1,1);
	while(tp) be[str[tp--]]=idx;
	sort(q+1,q+1+cntq,cmp);
	tim=0;
	int u=1,v=1;
	updata(1);
	for(int i=1;i<=cntq;i++){
		if(tim<q[i].t){
			modify(c[tim+1].u,c[tim+1].next);
			++tim;
		}
		if(tim>q[i].t){
			modify(c[tim].u,c[tim].last);
			--tim;
		}
		updata(lca(u,v));
		if(u!=q[i].u){
			move(u,q[i].u);
			u=q[i].u;
		}
		if(v!=q[i].v){
			move(v,q[i].v);
			v=q[i].v;
		}
		updata(lca(u,v));
		ans[q[i].id]=res;
	}
	for(int i=1;i<=cntq;i++) printf("%lld\n",ans[i]);
	return 0;
}
2023/1/4 20:59
加载中...