蒟蒻只AC#11 求调
查看原帖
蒟蒻只AC#11 求调
605945
luo_xiaoran楼主2024/3/21 07:49
#include<bits/stdc++.h>
#define ll long long
#define N (int)2e5+5
using namespace std;
int n,m,root=1,it,cnt,tot,a[N],head[N],dep[N],sz[N],son[N],id[N],top[N],fat[N],na[N],b[N][2];
struct Node{
	int sum,mx,mn,la,la1;
}tr[N<<2];
struct Edge{
	int u,v,w,nxt;
}e[N<<1];
inline void add(int u,int v,int w){
	e[++cnt]=Edge{u,v,w,head[u]};
	head[u]=cnt;
}
inline void dfs1(int u,int fa){
	dep[u]=dep[fa]+1;sz[u]=1;fat[u]=fa;
	for(int i=head[u];i;i=e[i].nxt){
		if(e[i].v==fa) continue;
		a[e[i].v]=e[i].w;
		fat[e[i].v]=u;
		dfs1(e[i].v,u);
		sz[u]+=sz[e[i].v];
		if(sz[e[i].v]>sz[son[u]]) son[u]=e[i].v;
	}
}
inline void dfs2(int u,int fa){
	id[u]=++tot,na[tot]=a[u];
	if(son[u]) top[son[u]]=top[u],dfs2(son[u],u);
	for(int i=head[u];i;i=e[i].nxt){
		if(e[i].v==fa||e[i].v==son[u]) continue;
		top[e[i].v]=e[i].v;
		dfs2(e[i].v,u);
	}
}
inline void pushup(int p){
	tr[p].mx=max(tr[p<<1].mx,tr[p<<1|1].mx);
	tr[p].mn=min(tr[p<<1].mn,tr[p<<1|1].mn);
	tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
}
inline void build(int l,int r,int p){
	tr[p].la1=INT_MAX;
	if(l==r){
		tr[p].mn=tr[p].mx=tr[p].sum=na[l];
		if(l==1) tr[p].mn=INT_MAX,tr[p].mx=INT_MIN;
		return ;
	}
	int m=(l+r)>>1;
	build(l,m,p<<1);build(m+1,r,p<<1|1);
	pushup(p);
}
inline void pushdown(int s,int t,int p){
	int m=s+t>>1;
	if(tr[p].la1!=INT_MAX){
		tr[p<<1].la=tr[p<<1|1].la=0;
		tr[p<<1].mn=tr[p<<1].mx=tr[p].la1=tr[p<<1|1].mn=tr[p<<1|1].mx=tr[p].la1;
		tr[p<<1].la1=tr[p<<1|1].la1=tr[p].la1;
		tr[p<<1].sum=(m-s+1)*tr[p].la1,tr[p<<1|1].sum=(t-m)*tr[p].la1;
	}
	if(tr[p].la==-1){
		tr[p<<1].mx=tr[p<<1].mn*tr[p].la;
		tr[p<<1].mn=tr[p<<1].mx*tr[p].la;
		tr[p<<1|1].mx=tr[p<<1|1].mn*tr[p].la;
		tr[p<<1|1].mn=tr[p<<1|1].mx*tr[p].la;
		tr[p<<1].sum*=tr[p].la,tr[p<<1|1].sum*=tr[p].la;
		if(tr[p<<1].la) tr[p<<1].la*=tr[p].la;
		else tr[p<<1].la=-1;
		if(tr[p<<1|1].la) tr[p<<1|1].la*=tr[p].la;
		else tr[p<<1|1].la=-1;
	}
	tr[p].la=0;
	tr[p].la1=INT_MAX;
}
inline void update(int l,int r,int s,int t,int c,int p){
	if(l>r) return ;
//	pushdown(s,t,p);
	if(l<=s&&t<=r){
		tr[p].sum*=c;
		swap(tr[p].mn,tr[p].mx);
		tr[p].mn*=-1;
		tr[p].mx*=-1;
		if(tr[p].la==-1) tr[p].la=0;
		else tr[p].la=-1;
		return ;
	}
	pushdown(s,t,p);
	int m=(s+t)>>1;
	if(l<=m) update(l,r,s,m,c,p<<1);
	if(r>m) update(l,r,m+1,t,c,p<<1|1);
	pushup(p);
}
inline void update1(int l,int r,int s,int t,int c,int p){
	if(l>r) return ;
	pushdown(s,t,p);
	if(l<=s&&t<=r){
		tr[p].mx=tr[p].mn=c;
		tr[p].sum=(t-s+1)*c;
		tr[p].la1=c;
		tr[p].la=0;
		return ;
	}
	pushdown(s,t,p);
	int m=(s+t)>>1;
	if(l<=m) update1(l,r,s,m,c,p<<1);
	if(r>m) update1(l,r,m+1,t,c,p<<1|1);
	pushup(p);
}
inline ll query_max(int l,int r,int s,int t,int p){
	if(l>r) return 0;
	if(l<=s&&t<=r) return tr[p].mx;
	pushdown(s,t,p);
	ll m=(s+t)>>1,v=INT_MIN;
	if(l<=m) v=query_max(l,r,s,m,p<<1);
	if(r>m) v=max(query_max(l,r,m+1,t,p<<1|1),v);
	return v;
}
inline ll query_min(int l,int r,int s,int t,int p){
	if(l>r) return 0;
	if(l<=s&&t<=r) return tr[p].mx;
	pushdown(s,t,p);
	ll m=(s+t)>>1,v=INT_MAX;
	if(l<=m) v=query_min(l,r,s,m,p<<1);
	if(r>m) v=min(query_min(l,r,m+1,t,p<<1|1),v);
	return v;
}
inline ll query_sum(int l,int r,int s,int t,int p){
	if(l>r) return 0;
	if(l<=s&&t<=r) return tr[p].sum;
	pushdown(s,t,p);
	ll m=(s+t)>>1,v=0;
	if(l<=m) v=query_sum(l,r,s,m,p<<1);
	if(r>m) v+=query_sum(l,r,m+1,t,p<<1|1);
	return v;
}
void update_path(int u,int v,int c){
	while(top[u]^top[v]){
		if(dep[top[u]]<dep[top[v]]) u^=v^=u^=v;
		update(id[top[u]],id[u],1,n,c,1);
		u=fat[top[u]];
	}
	if(dep[u]<dep[v]) u^=v^=u^=v;
	update(id[v]+1,id[u],1,n,c,1);
}
void update_path1(int u,int v,int c){
	while(top[u]^top[v]){
		if(dep[top[u]]<dep[top[v]]) u^=v^=u^=v;
		update1(id[top[u]],id[u],1,n,c,1);
		u=fat[top[u]];
	}
	if(dep[u]<dep[v]) u^=v^=u^=v;
	update1(id[v]+1,id[u],1,n,c,1);
}
ll query_path_max(int u,int v){
	ll ans=INT_MIN;
	while(top[u]^top[v]){
		if(dep[top[u]]<dep[top[v]]) u^=v^=u^=v;
		ans=max(query_max(id[top[u]],id[u],1,n,1),ans);
		u=fat[top[u]];
	}
	if(dep[u]<dep[v]) u^=v^=u^=v;
	return max(query_max(id[v]+1,id[u],1,n,1),ans);
}
ll query_path_min(int u,int v){
	ll ans=INT_MAX;
	while(top[u]^top[v]){
		if(dep[top[u]]<dep[top[v]]) u^=v^=u^=v;
		ans=min(query_min(id[top[u]],id[u],1,n,1),ans);
		u=fat[top[u]];
	}
	if(dep[u]<dep[v]) u^=v^=u^=v;
	return min(query_min(id[v]+1,id[u],1,n,1),ans);
}
ll query_path_sum(int u,int v){
	ll ans=0;
	while(top[u]^top[v]){
		if(dep[top[u]]<dep[top[v]]) u^=v^=u^=v;
		ans+=query_sum(id[top[u]],id[u],1,n,1);
		u=fat[top[u]];
	}
	if(dep[u]<dep[v]) u^=v^=u^=v;
	return (query_sum(id[v]+1,id[u],1,n,1)+ans);
}
int main(){
	cin>>n;
	for(int i=1,u,v,w;i<n;++i) scanf("%d%d%d",&u,&v,&w),++u,++v,b[++it][0]=u,b[it][1]=v,add(u,v,w),add(v,u,w);
	top[root]=root;
	dfs1(root,0);
	dfs2(root,0);
	build(1,n,1);
	cin>>m;
	while(m--){
		char s[8];
		int u,v,w;
		cin>>s>>u>>v;
		++u,++v;
		if(s[0]=='S') printf("%lld\n",query_path_sum(u,v));
		else if(s[0]=='C') update_path1(b[u-1][0],b[u-1][1],--v);
		else if(s[0]=='N') update_path(u,v,-1);
		else if(s[1]=='A') printf("%lld\n",query_path_max(u,v));
		else printf("%lld\n",query_path_min(u,v));
	}
	return 0;
}
2024/3/21 07:49
加载中...