AC #12求调
查看原帖
AC #12求调
757101
junee楼主2024/1/10 15:28
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=4e5+10;
LL h[N],e[N],ne[N],idx;
LL f[N],w[N];
LL sz[N],top[N],dep[N],son[N],fa[N];
LL id[N],cnt,nw[N];
void add(int a,int b,LL c){
	e[idx]=b,ne[idx]=h[a],f[idx]=c,h[a]=idx++;
}
struct node{
	int l,r;
	LL m,mi,sum,x;
}tr[N*4];
void pushup(int u){
	tr[u].m=max(tr[u<<1].m,tr[u<<1|1].m);
	tr[u].mi=min(tr[u<<1].mi,tr[u<<1|1].mi);
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void pushdown(int u){
	if(tr[u].x){
		tr[u<<1].sum=-tr[u<<1].sum;
		tr[u<<1|1].sum=-tr[u<<1|1].sum;
		
		tr[u<<1].m=-tr[u<<1].m;
		tr[u<<1].mi=-tr[u<<1].mi;
		swap(tr[u<<1].m,tr[u<<1].mi);
		
		tr[u<<1|1].m=-tr[u<<1|1].m;
		tr[u<<1|1].mi=-tr[u<<1|1].mi;
		swap(tr[u<<1|1].mi,tr[u<<1|1].m);
		
		tr[u<<1].x^=1;
		tr[u<<1|1].x^=1;
		tr[u].x=0;
	}
}
void build(int u,int l,int r){
	tr[u]={l,r,nw[r],nw[r],nw[r],0};
	if(l==r)return;
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
LL querymax(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		return tr[u].m; 
	}
	pushdown(u);
	LL res=-1e9;
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid)res=max(res,querymax(u<<1,l,r));
	if(r>mid)res=max(res,querymax(u<<1|1,l,r));
	return res;
}
LL querysum(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		return tr[u].sum; 
	}
	LL res=0;
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid)res+=querysum(u<<1,l,r);
	if(r>mid)res+=querysum(u<<1|1,l,r);
	return res;
}
LL querymin(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		return tr[u].mi; 
	}
	LL res=1e9;
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid)res=min(res,querymin(u<<1,l,r));
	if(r>mid)res=min(res,querymin(u<<1|1,l,r));
	return res;
}
void modify(int u,int l,int r,LL k){
	if(tr[u].l>=l&&tr[u].r<=r){
		tr[u].m=tr[u].mi=tr[u].sum=k;
		return;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid)modify(u<<1,l,r,k);
	if(r>mid)modify(u<<1|1,l,r,k);
	pushup(u);
}
void xorr(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		tr[u].m=-tr[u].m;
		tr[u].mi=-tr[u].mi;
		swap(tr[u].m,tr[u].mi);
		
		tr[u].sum=-tr[u].sum;
		tr[u].x^=1;
		return;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid)xorr(u<<1,l,r);
	if(r>mid)xorr(u<<1|1,l,r);
	pushup(u);
}
void dfs_son(int u,int father,int d){
	dep[u]=d,fa[u]=father,sz[u]=1;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==father)continue;
		w[j]=f[i];
		dfs_son(j,u,d+1);
		sz[u]+=sz[j];
		if(sz[son[u]]<sz[j])son[u]=j;
	}
}
void dfs(int u,int t){
	id[u]=++cnt,nw[cnt]=w[u],top[u]=t;
	if(!son[u])return;
	dfs(son[u],t);
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==son[u]||j==fa[u])continue;
		dfs(j,j);
	}
}
LL query_path_max(int u,int v){
	LL res=-1e9;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		res=max(res,querymax(1,id[top[u]],id[u]));
		u=fa[top[u]];
	}
	if(u==v)return res;
	if(dep[u]<dep[v])swap(u,v);
	res=max(res,querymax(1,id[v]+1,id[u]));
	return res;
}
LL query_path_min(int u,int v){
	LL res=1e9;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		res=min(res,querymin(1,id[top[u]],id[u]));
		u=fa[top[u]];
	}
	if(u==v)return res;
	if(dep[u]<dep[v])swap(u,v);
	res=min(res,querymin(1,id[v]+1,id[u]));
	return res;
}
LL query_path_sum(int u,int v){
	LL res=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		res+=querysum(1,id[top[u]],id[u]);
		u=fa[top[u]];
	}
	if(u==v)return res;
	if(dep[u]<dep[v])swap(u,v);
	res+=querysum(1,id[v]+1,id[u]);
	return res;
}
void change(int u,int v,LL k){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		modify(1,id[top[u]],id[u],k);
		u=fa[top[u]];
	}
	if(u==v)return;
	if(dep[u]<dep[v])swap(u,v);
	modify(1,id[v]+1,id[u],k);
}
void xor_path(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		xorr(1,id[top[u]],id[u]);
		u=fa[top[u]];
	}
	if(u==v)return;
	if(dep[u]<dep[v])swap(u,v);
	xorr(1,id[v]+1,id[u]);
}
int main(){
	memset(h,-1,sizeof h);
	int n;
	cin>>n;
	for(int i=1;i<n;i++){
		LL a,b,c;
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
	dfs_son(1,-1,1);
	dfs(1,1);
	build(1,1,n);
	int m;
	cin>>m;
	while(m--){
		string a;
		cin>>a;
		if(a=="C"){
			int x,k;
			cin>>x>>k;
			int u=e[x*2-1],v=e[(x*2-1)^1];
			if(fa[u]!=v)swap(u,v);
			change(v,u,k);
		}
		if(a=="MAX"){
			int u,v;
			cin>>u>>v;
			cout<<query_path_max(u,v)<<endl;
		}
		if(a=="SUM"){
			int u,v;
			cin>>u>>v;
			cout<<query_path_sum(u,v)<<endl;
		}
		if(a=="MIN"){
			int u,v;
			cin>>u>>v;
			cout<<query_path_min(u,v)<<endl;
		}
		if(a=="N"){
			int u,v;
			cin>>u>>v;
			xor_path(u,v);
		}
	}
	return 0;
}

2024/1/10 15:28
加载中...