全RE求助
查看原帖
全RE求助
1024529
sszxyyds楼主2024/4/21 15:14
#include<bits/stdc++.h>
#define N 2000100
#define mid ((l+r)>>1)
#define int long long
using namespace std;
int n,m,cnt,hd[N],c;
struct node{
	int to,nxt,val;
}e[N];
struct bian{
	int x,y;
}bi[N];
int fa[N],maxson[N],dep[N],top[N],id[N],siz[N],tmp[N],sums[N],mins[N],maxs[N],laz[N],w[N];
void dfs1(int x,int f){
	fa[x]=f;
	dep[x]=dep[f]+1;
	siz[x]=1;
	for(int i=hd[x];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==f){
			continue;
		}
		tmp[v]=e[i].val;//the value of edge->value of point
		dfs1(v,x);
		siz[x]+=siz[v];
		if(siz[maxson[x]]<siz[v]){
			maxson[x]=v;
		}
	}
}
void dfs2(int x,int tops){
	id[x]=++cnt;//new knot
	w[cnt]=tmp[x];
	top[x]=tops;
	if(maxson[x]){
		dfs2(maxson[x],tops);
	}
	for(int i=hd[x];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa[x]||v==maxson[x]){
			continue;
		}
		dfs2(v,v);
	}
}
void pushup(int x){
	mins[x]=min(mins[x<<1],mins[x<<1|1]);
	maxs[x]=max(maxs[x<<1],maxs[x<<1|1]);
	sums[x]=(sums[x<<1]+sums[x<<1|1]);
}

void build(int x,int l,int r){
	if(l==r){
		sums[x]=mins[x]=maxs[x]=w[l];
		return;
	}
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
}

void pushdown(int x){
	laz[x<<1]^=1;laz[x<<1|1]^=1;
	laz[x]=0;
	mins[x<<1]=-mins[x<<1];
	maxs[x<<1]=-maxs[x<<1];
	swap(mins[x<<1],maxs[x<<1]);
	sums[x<<1]=-sums[x<<1];
	mins[x<<1|1]=-mins[x<<1|1];
	maxs[x<<1|1]=-maxs[x<<1|1];
	swap(mins[x<<1|1],maxs[x<<1|1]);
	sums[x<<1|1]=-sums[x<<1|1];
}
void fan(int now,int x,int y,int l,int r){
	if(x<=l&&r<=y){
		laz[now]^=1;
		mins[now]=-mins[now];
		maxs[now]=-maxs[now];
		swap(mins[now],maxs[now]);
		sums[now]=-sums[now];
		return;
	}
	if(laz[now]){
		pushdown(now);
	}
	if(x<=mid){
		fan(now<<1,x,y,l,mid);
	}
	if(y>mid){
		fan(now<<1|1,x,y,mid+1,r);
	}
	pushup(now);
}
void ddxg(int now,int l,int r,int x,int y){
	if(l==r){
		mins[now]=maxs[now]=sums[now]=y;
		return;
	}
	if(laz[now]){
		pushdown(now);
	}
	if(x<=mid){
		ddxg(now<<1,l,mid,x,y);
	}else{
		ddxg(now<<1|1,mid+1,r,x,y);
	}
	pushup(now);
}
int getsum(int now,int x,int y,int l,int r){
	int ans=0;
	if(x<=l&&y>=r){
		return sums[now];
	}
	if(laz[now]){
		pushdown(now);
	}
	if(x<=mid){
		ans+=getsum(now<<1,x,y,l,mid);
	}
	if(y>mid){
		ans+=getsum(now<<1|1,x,y,mid+1,r);
	}
	return ans;
}
int getmax(int now,int x,int y,int l,int r){
	int ans=-2147483647;
	if(x<=l&&y>=r){
		return maxs[now];
	}
	if(laz[now]){
		pushdown(now);
	}
	if(x<=mid){
		ans=max(ans,getmax(now<<1,x,y,l,mid));
	}
	if(y>mid){
		ans=max(ans,getmax(now<<1|1,x,y,mid+1,r));
	}
	return ans;
}
int getmin(int now,int x,int y,int l,int r){
	int ans=2147483647;
	if(x<=l&&y>=r){
		return mins[now];
	}
	if(laz[now]){
		pushdown(now);
	}
	if(x<=mid){
		ans=min(ans,getmin(now<<1,x,y,l,mid));
	}
	if(y>mid){
		ans=min(ans,getmin(now<<1|1,x,y,mid+1,r));
	}
	return ans;
}
void add(int x,int y,int z){
	e[++c].to=y;
	e[c].nxt=hd[x];
	e[c].val=z;
	hd[x]=cnt;
}

void update(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]){
			swap(x,y);
		}
		fan(1,id[top[x]],id[x],1,n);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	if(x!=y){
		fan(1,id[x]+1,id[y],1,n);
	}
}
int qsum(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]){
			swap(x,y);
		}
		ans+=getsum(1,id[top[x]],id[x],1,n);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	if(x!=y){
		ans+=getsum(1,id[x]+1,id[y],1,n);
	}
	return ans;
}
int qmin(int x,int y){
	int ans=2147483647;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]){
			swap(x,y);
		}
		ans=min(ans,getmin(1,id[top[x]],id[x],1,n));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	if(x!=y){
		ans=min(ans,getmin(1,id[x]+1,id[y],1,n));
	}
	return ans;
}
int qmax(int x,int y){
	int ans=-2147483647;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]){
			swap(x,y);
		}
		ans=max(ans,getmax(1,id[top[x]],id[x],1,n));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	if(x!=y){
		ans=max(ans,getmax(1,id[x]+1,id[y],1,n));
	}
	return ans;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<n;i++){
		int a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		a++,b++;
		add(a,b,c);add(b,a,c);
		bi[i].x=a,bi[i].y=b;
	}
	dfs1(1,0);dfs2(1,1);
	build(1,1,n);	
	scanf("%lld",&m);
	char s[5];
	while(m--){
		int a,b;
		scanf("%s",s);
		scanf("%lld%lld",&a,&b);
		if(s[0]=='C'){
			int aa=(dep[bi[a].x]>dep[bi[a].y]?bi[a].x:bi[a].y);
			ddxg(1,1,n,id[aa],b);
		}	
		if(s[0]=='N'){
			a++,b++;
			update(a,b);
		}
		if(s[0]=='S'){
			a++,b++;
			printf("%lld\n",qsum(a,b));
		}
		if(s[0]=='M'&&s[1]=='A'){
			a++,b++;
			printf("%lld\n",qmax(a,b));
		}
		if(s[0]=='M'&&s[1]=='I'){
			a++,b++;
			printf("%lld\n",qmin(a,b));
		}
	}
	return 0;
}
2024/4/21 15:14
加载中...