样例已过,求条
查看原帖
样例已过,求条
952595
Shi_se楼主2023/11/5 16:07
#include<bits/stdc++.h>
#define N 1000006
#define int long long
#define mid ((l+r)>>1)
#define lp (p<<1)
#define rp (p<<1|1)
using namespace std;
int re(){
	int x=0,p=1;
	char y=getchar();
	for(;y<'0'||y>'9';y=getchar())
		if(y=='-')
			p=-p;
	for(;y>='0'&&y<='9';y=getchar())
		x=x*10+y-'0';
	return x*p;
}
void wr(int x){
	if(x<0)
		putchar('-'),x=-x;
	if(x>9)
		wr(x/10);
	putchar(x%10+'0');
}
int n,m;
int cnt,num;
int val[N];
int Maxx[N];
int add[N],cha[N];
int fir[N],nex[N],poi[N],poi_val[N];
int fa[N],son[N],dep[N],siz[N];
int dfn[N],top[N],rnk[N];
void dfs_1(int x,int f){
	fa[x]=f;siz[x]=1;
	dep[x]=dep[f]+1;
	for(int i=fir[x];i;i=nex[i]){
		int p=poi[i];
		if(p==f)
			continue;
		dfs_1(p,x);poi_val[p]=val[i];
		siz[x]+=siz[p];
		if(siz[son[x]]<siz[p])
			son[x]=p;
	}
}
void dfs_2(int x,int topn){
	top[x]=topn;
	dfn[x]=++num;rnk[num]=x;
	if(!son[x])
		return;
	dfs_2(son[x],topn);
	for(int i=fir[x];i;i=nex[i]){
		int p=poi[i];
		if(dfn[p])
			continue;
		dfs_2(p,p);
	}
}
void ins(int x,int y,int z){
	nex[++cnt]=fir[x];
	fir[x]=cnt;
	poi[cnt]=y;
	val[cnt]=z;
}
void Push_up(int p){
	Maxx[p]=max(Maxx[lp],Maxx[rp]);
}
void Push_add(int p,int k){
	Maxx[p]+=k;
	add[p]+=k;
}
void Push_change(int p,int k){
	if(k==-1)
		return;
	Maxx[p]=k;
	cha[p]=k;
	add[p]=0;
}
void Build(int l,int r,int p){
	cha[p]=-1;
	if(l==r){
		Maxx[p]=poi_val[rnk[l]];
		return;
	}
	Build(l,mid,lp);
	Build(mid+1,r,rp);
	Push_up(p);
}
void Push_down(int p){
		Push_change(lp,cha[p]);
		Push_change(rp,cha[p]);
		Push_add(lp,add[p]);
		Push_add(rp,add[p]);
		add[p]=0;cha[p]=-1;
}
void Add(int al,int ar,int l,int r,int p,int k){
	if(al<=l&&ar>=r){
		Push_add(p,k);
		return;
	}
	Push_down(p);
	if(al<=mid)
		Add(al,ar,l,mid,lp,k);
	if(ar>mid)
		Add(al,ar,mid+1,r,rp,k);
	Push_up(p);
}
int Ask(int al,int ar,int l,int r,int p){
	if(al<=l&&ar>=r)
		return Maxx[p];
	Push_down(p);
	int maxx=-10000000;
	if(al<=mid)
		maxx=max(maxx,Ask(al,ar,l,mid,lp));
	if(ar>mid)
		maxx=max(maxx,Ask(al,ar,mid+1,r,rp));
	return maxx;
}
void Change(int al,int ar,int l,int r,int p,int k){
	if(al<=l&&ar>=r){
		Push_change(p,k);
		return;
	}
	Push_down(p);
	if(al<=mid)
		Change(al,ar,l,mid,lp,k);
	if(ar>mid)
		Change(al,ar,mid+1,r,rp,k);
	Push_up(p);
}
void Lchange(int x,int y,int k){			//区间推平 
	for(;top[x]^top[y];x=fa[top[x]]){
		if(dep[top[x]]<dep[top[y]])
			x^=y^=x^=y;
		Change(dfn[top[x]],dfn[x],1,n,1,k);
	}
	if(dep[x]>dep[y])
		x^=y^=x^=y;
	Change(dfn[x]+1,dfn[y],1,n,1,k);
}
void Lcadd(int x,int y,int k){			//区间加 
	for(;top[x]^top[y];x=fa[top[x]]){
		if(dep[top[x]]<dep[top[y]])
			x^=y^=x^=y;
		Add(dfn[top[x]],dfn[x],1,n,1,k);
	}
	if(dep[x]>dep[y])
		x^=y^=x^=y;
	Add(dfn[x]+1,dfn[y],1,n,1,k);
}
int Lcask(int x,int y){		//树剖区间最大值 
	int maxx=-1000000;
	for(;top[x]^top[y];x=fa[top[x]]){
		if(dep[top[x]]<dep[top[y]])
			x^=y^=x^=y;
		maxx=max(maxx,Ask(dfn[top[x]],dfn[x],1,n,1));
	}
	if(dep[x]>dep[y])
		x^=y^=x^=y;
	maxx=max(maxx,Ask(dfn[x]+1,dfn[y],1,n,1));
	return maxx;
}
signed main()
{
	n=re();
	for(int i=1;i<n;i++){
		int u=re(),v=re(),w=re();
		ins(u,v,w),ins(v,u,w);
	}
	dfs_1(1,1);dfs_2(1,1);
	Build(1,n,1);
	int flag=0;
	while(flag!=1){
		string s;
		cin>>s;
		if(s=="Change"){
			int x=re(),k=re(),H;
			if(poi[x*2]==fa[poi[x*2-1]])
				H=poi[x*2-1];
			else 
				H=poi[x*2];
			Change(H,H,1,n,1,k);
		}
		if(s=="Cover"){
			int x=re(),y=re(),k=re();
			Lchange(x,y,k);
		}
		if(s=="Add"){
			int x=re(),y=re(),k=re();
			Lcadd(x,y,k);
		}
		if(s=="Max"){
			int x=re(),y=re();
			wr(Lcask(x,y)),putchar('\n');
		}
		if(s=="Stop")
			flag=1;
	}
	return 0;
}

2023/11/5 16:07
加载中...