P5559,样例不过求调,悬两关
  • 板块灌水区
  • 楼主hzx222
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/23 20:39
  • 上次更新2024/8/23 21:42:30
查看原帖
P5559,样例不过求调,悬两关
788765
hzx222楼主2024/8/23 20:39
#include<bits/stdc++.h>
using namespace std;
#define N 200010
#define int long long
struct node{
	int next,to,w;
}ed[N<<1];
int tot,idx,cnt,head[N],son[N],dfn[N],fa[N],top[N],dep[N],dis[N];
int a[N],siz[N],rev[N];
inline void add(int x,int y,int z){
	ed[++tot].next=head[x];
	ed[tot].to=y;
	ed[tot].w=z;
	head[x]=tot;
}
inline void dfs1(int u,int f){
	siz[u]=1;
	fa[u]=f;
	dep[u]=dep[f]+1;
	for(int i=head[u];i;i=ed[i].next){
		int v=ed[i].to;
		if(v==f)continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		a[v]=ed[i].w;
		dis[v]=dis[u]+ed[i].w;
		if(siz[son[u]]<siz[v])son[u]=v;
	}
}
inline void dfs2(int x,int vt){
	top[x]=vt;
	dfn[x]=++idx;
	rev[idx]=x;
	if(son[x])dfs2(son[x],vt);
	for(int i=head[x];i;i=ed[i].next){
		int v=ed[i].to;
		if(v==fa[x]||v==son[x])continue;
		dfs2(v,v);
	}
}
struct treee{
	int lz,w,sum,l,r;
}tr[N<<2];
inline void build(int rt,int l,int r){
	tr[rt].l=l,tr[rt].r=r;
	if(l==r){
		tr[rt].w=a[rev[l]];
		return;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	tr[rt].w=tr[rt<<1].w+tr[rt<<1|1].w;
}
inline void pushdown(int rt){
	tr[rt<<1].lz+=tr[rt].lz;
	tr[rt<<1|1].lz+=tr[rt].lz;
	tr[rt<<1].sum+=tr[rt<<1].w*tr[rt].lz;
	tr[rt<<1|1].sum+=tr[rt<<1|1].w*tr[rt].lz;
	tr[rt].lz=0;
}
inline void change(int rt,int l,int r,int k){
	if(l<=tr[rt].l&&tr[rt].r<=r){
		tr[rt].lz+=k;
		tr[rt].sum+=k*tr[rt].w;
		return;
	}
	pushdown(rt);
	int mid=tr[rt].l+tr[rt].r>>1;
	if(l<=mid)change(rt<<1,l,r,k);
	if(r>mid)change(rt<<1|1,l,r,k);
	tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
}
inline int query(int rt,int l,int r){
	if(l<=tr[rt].l&&tr[rt].r<=r){
		return tr[rt].sum;
	}
	pushdown(rt);
	int mid=tr[rt].l+tr[rt].r>>1,ret=0;
	if(l<=mid) ret+=query(rt<<1,l,r);
	if(r>mid)ret+=query(rt<<1|1,l,r);
	return ret;
}
inline int lca(int x,int y){
	while(top[x]^top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	return x;
}
inline int lca_query(int x,int y){
	int ret=0;
	while(top[x]^top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ret+=query(1,dfn[top[x]],dfn[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	ret+=query(1,dfn[x]+1,dfn[y]);
	return ret;
}
inline void lca_change(int x,int y,int p){
	while(top[x]^top[y]){
		if(dep[top[x]]<dep[top[x]])swap(x,y);
		change(1,dfn[top[x]],dfn[x],p);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	change(1,dfn[x]+1,dfn[y],p);
}
int ans=0;
inline void qwq(int x){
	if(a[x]){
		ans-=dis[x];
		lca_change(x,1,-1);
		--cnt;
	}
	else{
		ans+=dis[x];
		lca_change(x,1,1);
		++cnt;
	}
	a[x]^=1;
}
int n,m,ty;
signed main(){
	scanf("%lld%lld%lld",&n,&m,&ty);
	for(int i=1;i<n;i=-~i){
		int x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	//	cout<<"qwq";
	}
	dfs1(1,0),dfs2(1,1);
	build(1,1,n);
	memset(a,0,sizeof(a));
	for(int i=1;i<=n;i=-~i){
		int x;
		scanf("%lld",&x);
		if(x)qwq(i);
		
	}//cout<<"qwq";
	for(int i=1;i<=m;i=-~i){
		int opt,x,y;
		scanf("%lld%lld",&opt,&x);
		if(opt==1){
			qwq(x);
		}
		else{
			scanf("%lld",&y);
			int lc=lca(x,y);
			printf("%lld\n",ans+cnt*dis[lc]-2*lca_query(1,lc)-lca_query(x,y));
		}
	}
}
2024/8/23 20:39
加载中...