求大佬进房
  • 板块灌水区
  • 楼主allqpsi
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/2/29 21:03
  • 上次更新2024/2/29 22:57:12
查看原帖
求大佬进房
380406
allqpsi楼主2024/2/29 21:03

竟然进来了,就帮帮本蒟蒻吧,赏一关:

P1505

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,lso,top[200005],t=0,fa[200005],hs[200005],siz[200005],di[200005],a,b,c,d,in[200005],cnt,mod;
vector<int>vi[200005];
string s;
int ai[200005],bi[200005],r,sum[800005],maxx[800005],minn[800005],xi[200005],yi[200005],zi[200005];
bool neg[800005];
void pushdown(int rt,int l,int r){
	if(neg[rt]){
		sum[rt*2]=-sum[rt*2];
		sum[rt*2+1]=-sum[rt*2+1];
		int t1=maxx[rt*2],t2=maxx[rt*2+1];
		maxx[rt*2]=-minn[rt*2];
		maxx[rt*2+1]=-minn[rt*2];
		minn[rt*2]=-t1;
		minn[rt*2+1]=-t2;
		neg[rt*2]=!neg[rt*2];
		neg[rt*2+1]=!neg[rt*2+1];
		neg[rt]=false;
	}
}
void pushup(int rt){
	maxx[rt]=max(maxx[rt*2],maxx[rt*2+1]);
	minn[rt]=min(minn[rt*2],minn[rt*2+1]);
	sum[rt]=sum[rt*2]+sum[rt*2+1];
}
void build(int l,int r,int rt){
	if(l==r){
		maxx[rt]=sum[rt]=minn[rt]=ai[l];
		neg[rt]=false;
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,rt*2);
	build(mid+1,r,rt*2+1);
	pushup(rt);
}
void update(int l,int r,int rt,int x,int y,int v){
	if(x<=l&&y>=r){
		sum[rt]=-sum[rt];
		int t=maxx[rt];
		maxx[rt]=-minn[rt];
		minn[rt]=-t;
		neg[rt]=!neg[rt];
		return;
	}
	int mid=(l+r)/2;
	pushdown(rt,mid-l+1,r-mid);
	if(x<=mid){
		update(l,mid,rt*2,x,y,v);
	}
	if(y>mid){
		update(mid+1,r,rt*2+1,x,y,v);
	}
	pushup(rt);
}
void cover(int l,int r,int rt,int x,int y,int v){
	if(x<=l&&y>=r){
		maxx[rt]=minn[rt]=sum[rt]=v;
		return;
	}
	int mid=(l+r)/2;
	pushdown(rt,mid-l+1,r-mid);
	if(x<=mid){
		cover(l,mid,rt*2,x,y,v);
	}
	if(y>mid){
		cover(mid+1,r,rt*2+1,x,y,v);
	}
	pushup(rt);
}
int querymx(int l,int r,int rt,int x,int y){
	if(x<=l&&y>=r){
		return maxx[rt];
	}
	int ans=-1e9,mid=(l+r)/2;
	pushdown(rt,mid-l+1,r-mid);
	if(x<=mid){
		ans=max(ans,querymx(l,mid,rt*2,x,y));
	}
	if(y>mid){
		ans=max(ans,querymx(mid+1,r,rt*2+1,x,y));
	}
	pushup(rt);
	return ans;
}
int querymn(int l,int r,int rt,int x,int y){
	if(x<=l&&y>=r){
		return minn[rt];
	}
	int ans=1e9,mid=(l+r)/2;
	pushdown(rt,mid-l+1,r-mid);
	if(x<=mid){
		ans=min(ans,querymn(l,mid,rt*2,x,y));
	}
	if(y>mid){
		ans=min(ans,querymn(mid+1,r,rt*2+1,x,y));
	}
	pushup(rt);
	return ans;
}
int querysm(int l,int r,int rt,int x,int y){
	if(x<=l&&y>=r){
		return sum[rt];
	}
	int ans=0,mid=(l+r)/2;
	pushdown(rt,mid-l+1,r-mid);
	if(x<=mid){
		ans+=querysm(l,mid,rt*2,x,y);
	}
	if(y>mid){
		ans+=querysm(mid+1,r,rt*2+1,x,y);
	}
	pushup(rt);
	return ans;
}
void dfs1(int x,int fat){
	fa[x]=fat;
	siz[x]=1;
	di[x]=di[fat]+1;
	for(int i=0;i<vi[x].size();i++){
		int v=vi[x][i];
		if(v==fat){
			continue;
		}
		dfs1(v,x);
		if(!hs[x]||siz[v]>siz[hs[x]]){
			hs[x]=v;
		}
		siz[x]+=siz[v];
	}
}
void dfs2(int x,int t){
	cnt++;
	in[x]=cnt;
	top[x]=t;
	if(hs[x]){
		dfs2(hs[x],t);
	}
	for(int i=0;i<vi[x].size();i++){
		int v=vi[x][i];
		if(v==fa[x]||v==hs[x]){
			continue;
		}
		dfs2(v,v);
	}
}
void uppath(int x,int y,int k){
	while(top[x]!=top[y]){
		if(di[top[x]]>=di[top[y]]){
			update(1,n,1,in[top[x]],in[x],k);
			x=fa[top[x]];
		}
		else{
			update(1,n,1,in[top[y]],in[y],k);
			y=fa[top[y]];
		}
	}
	if(x==y){
		return;
	}
	if(di[x]<di[y]){
		update(1,n,1,in[hs[x]],in[y],k);
	}
	else{
		update(1,n,1,in[hs[y]],in[x],k);
	}
}
int smpath(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(di[top[x]]>=di[top[y]]){
			ans+=querysm(1,n,1,in[top[x]],in[x]);
			x=fa[top[x]];
		}
		else{
			ans+=querysm(1,n,1,in[top[y]],in[y]);
			y=fa[top[y]];
		}
	}
	if(x==y){
		return ans;
	}
	if(di[x]<di[y]){
		ans+=querysm(1,n,1,in[hs[x]],in[y]);
	}
	else{
		ans+=querysm(1,n,1,in[hs[y]],in[x]);
	}
	return ans;
}
int mnpath(int x,int y){
	int ans=1e9;
	while(top[x]!=top[y]){
		if(di[top[x]]>=di[top[y]]){
			ans=min(ans,querymn(1,n,1,in[top[x]],in[x]));
			x=fa[top[x]];
		}
		else{
			ans=min(ans,querymn(1,n,1,in[top[y]],in[y]));
			y=fa[top[y]];
		}
	}
	if(x==y){
		return ans;
	}
	if(di[x]<di[y]){
		ans=min(ans,querymn(1,n,1,in[hs[x]],in[y]));
	}
	else{
		ans=min(ans,querymn(1,n,1,in[hs[y]],in[x]));
	}
	return ans;
}
int mxpath(int x,int y){
	int ans=-1e9;
	while(top[x]!=top[y]){
		if(di[top[x]]>=di[top[y]]){
			ans=max(ans,querymx(1,n,1,in[top[x]],in[x]));
			x=fa[top[x]];
		}
		else{
			ans=max(ans,querymx(1,n,1,in[top[y]],in[y]));
			y=fa[top[y]];
		}
	}
	if(x==y){
		return ans;
	}
	if(di[x]<di[y]){
		ans=max(ans,querymx(1,n,1,in[hs[x]],in[y]));
	}
	else{
		ans=max(ans,querymx(1,n,1,in[hs[y]],in[x]));
	}
	return ans;
}
signed main(){
	memset(minn,127,sizeof(minn));
	memset(maxx,-127,sizeof(maxx));
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>xi[i]>>yi[i]>>zi[i];
		vi[xi[i]].push_back(yi[i]);
		vi[yi[i]].push_back(xi[i]);
	}
	dfs1(0,-1);
	dfs2(0,0);
	for(int i=1;i<n;i++){
		if(di[xi[i]]>di[yi[i]]){
			swap(xi[i],yi[i]);
		}
		ai[in[yi[i]]]=zi[i];
	}
	build(1,n,1);
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>s;
		if(s=="C"){
			cin>>a>>b;
			cover(1,n,1,in[yi[a]],in[yi[a]],b);
			lso=i;
		}
		if(s=="N"){
			cin>>a>>b;
			if(a==b){
				continue;
			}
			uppath(a,b,0);
			lso=i;
		}
		if(s=="SUM"){
			cin>>a>>b;
			if(a==b){
				cout<<0<<endl;
				continue;
			}
			cout<<smpath(a,b)<<endl;
		}
		if(s=="MAX"){
			cin>>a>>b;
			if(a==b){
				cout<<0<<endl;
				continue;
			}
			cout<<mxpath(a,b)<<endl;
		}
		if(s=="MIN"){
			cin>>a>>b;
			if(a==b){
				cout<<0<<endl;
				continue;
			}
			cout<<mnpath(a,b)<<endl;
		}
	}
} 
2024/2/29 21:03
加载中...