求调,只过了最后一个点
查看原帖
求调,只过了最后一个点
602833
kczw楼主2024/1/8 10:31
#include<iostream>
#include<vector>
#define mid (l+r>>1)
#define L (p<<1)
#define R (p<<1|1)
#define N 100005 
using namespace std;
vector<int> r[N];
int n,sfn,id[N],dep[N],siz[N],son[N],fa[N],top[N],W[N],aa[N],bb[N];
struct tree{int l,r,ad,fx,w,mx;}tr[N<<2];
inline void build(int p,int l,int r){
	tr[p]={l,r,0,-1,-1,0};
	if(l==r)return;
	build(L,l,mid);
	build(R,mid+1,r);
}inline void upad(int p,int ad){tr[p].ad+=ad;tr[p].mx+=ad;tr[p].w=0;}
inline void upfx(int p,int fx){tr[p].fx=fx;tr[p].mx=fx;tr[p].w=1;}
inline void pushdown(int p){
	if(tr[p].w!=-1){
		if(tr[p].w)upfx(L,tr[p].fx),upfx(R,tr[p].fx),tr[p].fx=-1,tr[p].ad=0;
		else{
			if(tr[p].fx!=-1)upfx(L,tr[p].fx),upfx(R,tr[p].fx),tr[p].fx=-1;
			upad(L,tr[p].ad);upad(R,tr[p].ad);tr[p].ad=0;
		}tr[p].w=-1;
	}
}inline void add(int p,int l,int r,int w){
	if(tr[p].l>r||tr[p].r<l)return;
	if(tr[p].l>=l&&tr[p].r<=r)return upad(p,w);
	pushdown(p);add(L,l,r,w);add(R,l,r,w);
	tr[p].mx=max(tr[L].mx,tr[R].mx);
}inline void fix(int p,int l,int r,int w){
	if(tr[p].l>r||tr[p].r<l)return;
	if(tr[p].l>=l&&tr[p].r<=r)return upfx(p,w);
	pushdown(p);fix(L,l,r,w);fix(R,l,r,w);
	tr[p].mx=max(tr[L].mx,tr[R].mx);
}inline int query(int p,int l,int r){
	if(tr[p].l>r||tr[p].r<l)return 0;
	if(tr[p].l>=l&&tr[p].r<=r)return tr[p].mx;
	pushdown(p);return max(query(L,l,r),query(R,l,r));
}inline void addt(int u,int v,int w){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])u^=v,v^=u,u^=v;
		add(1,id[top[u]],id[u],w);
		u=fa[top[u]];
	}if(dep[u]>dep[v])u^=v,v^=u,u^=v;
	if(u==v)return;
	add(1,id[son[u]],id[v],w);
}inline void fixt(int u,int v,int w){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])u^=v,v^=u,u^=v;
		fix(1,id[top[u]],id[u],w);
		u=fa[top[u]];
	}if(dep[u]>dep[v])u^=v,v^=u,u^=v;
	if(u==v)return;
	fix(1,id[son[u]],id[v],w);
}inline int queryt(int u,int v){
	int res=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])u^=v,v^=u,u^=v;
		res=max(res,query(1,id[top[u]],id[u]));
		u=fa[top[u]];
	}if(dep[u]>dep[v])u^=v,v^=u,u^=v;
	if(u==v)return res;
	return max(res,query(1,id[son[u]],id[v]));
}inline void dfs1(int u,int faa){
	fa[u]=faa;dep[u]=dep[faa]+1;siz[u]=1;
	for(auto v:r[u])if(v!=faa){
		dfs1(v,u);siz[u]+=siz[v];
		if(siz[v]>siz[son[u]])son[u]=v;
	}
}inline void dfs2(int u,int tp){
	top[u]=tp;id[u]=++sfn;
	if(!son[u])return;
	dfs2(son[u],tp);
	for(auto v:r[u])if(v!=fa[u]&&v!=son[u])dfs2(v,v);
}int main(){
//	freopen("c.out","w",stdout);
	scanf("%d",&n);
	for(int i=1,u,v;i<n;i++){
		scanf("%d%d%d",&u,&v,&W[i]);
		r[u].emplace_back(v);r[v].emplace_back(u);
		aa[i]=u;bb[i]=v;
	}dfs1(1,1);dfs2(1,1);build(1,1,n);
	for(int i=1;i<n;i++)dep[aa[i]]>dep[bb[i]]?aa[i]=aa[i]:aa[i]=bb[i],fix(1,id[aa[i]],id[aa[i]],W[i]);
	char op[77];int u,v,w;scanf("%s",op);
	while(op[0]!='S'){
		if(op[0]=='M')scanf("%d%d",&u,&v),printf("%d\n",queryt(u,v));
		else if(op[0]=='A')scanf("%d%d%d",&u,&v,&w),addt(u,v,w);
		else if(op[1]=='h')scanf("%d%d",&u,&v),fix(1,id[aa[u]],id[aa[u]],v);
		else scanf("%d%d%d",&u,&v,&w),fixt(u,v,w);
		scanf("%s",op);
	}return 0;
}
2024/1/8 10:31
加载中...