谢谢
查看原帖
谢谢
235766
Thomas盟盟楼主2022/10/28 19:03
#include<bits/stdc++.h>
using namespace std;
#define D cout<<__LINE__<<" "<<__FUNCTION__<<endl;
#define D //
const int inf=0x3f3f3f3f;
const int N=1e5+10;
int n;
struct edge
{
	int to,nxt,w;
	edge()
	{
		to=0;
		nxt=0;
		w=0;
	}
} e[N*2];
int tot,head[N*2];

int val[N],va[N];


inline int read()
{
	int f=1,x=0;
	char c=getchar();
	while(!isdigit(c))
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(isdigit(c))
	{
		x=x*10+(c^48);
		c=getchar();
	}
	return x*f;
}
inline void add(int a,int b,int w)
{
	e[++tot].to=b;
	e[tot].w=w;
	e[tot].nxt=head[a];
	head[a]=tot;
}
namespace seg
{
	int cov[N*4];
	int mx[N*4];
	int ad[N*4];
#define ls (rt*2)
#define rs (rt*2+1)
#define mid ((l+r)>>1)
	inline void mat(int rt)
	{
		mx[rt]=max(mx[ls],mx[rs]);
	}
	inline void psh(int rt,int l,int r)
	{
		if(cov[rt]!=-1)
		{
			cov[ls]=cov[rt];
			cov[rs]=cov[rt];
			ad[ls]=0;
			ad[rs]=0;
			mx[ls]=cov[rt];
			mx[rs]=cov[rt];
			cov[rt]=-1;
		}
		ad[ls]+=ad[rt];
		ad[rs]+=ad[rt];
		cov[ls]+=ad[rt];
		cov[rs]+=ad[rt];
		ad[rt]=0;
	}
	inline void build(int l,int r,int rt)
	{
		cov[rt]=-1;
		ad[rt]=0;
		if(l==r)
		{
			mx[rt]=val[l];
			return ;
		}
		build(l,mid,ls);
		build(mid+1,r,rs);
		mat(rt);
	}
	inline void change(int l,int r,int L,int R,int rt,int v)
	{
		if(L<=l&&r<=R)
		{
			ad[rt]=0;
			mx[rt]=v;
			cov[rt]=v;
			return ;
		}
		psh(rt,l,r);
		if(L<=mid)change(l,mid,L,R,ls,v);
		if(mid<R)change(mid+1,r,L,R,rs,v);
		mat(rt);
	}
	inline void add(int l,int r,int L,int R,int rt,int v)
	{
		if(L<=l&&r<=R)
		{
			ad[rt]+=v;
			mx[rt]+=v;
			return ;
		}
		psh(rt,l,r);
		if(L<=mid)add(l,mid,L,R,ls,v);
		if(mid<R)add(mid+1,r,L,R,rs,v);
		mat(rt);
	}
	inline int query(int l,int r,int L,int R,int rt)
	{
		if(L<=l&&r<=R)
		{
			return mx[rt];
		}
		int res=-inf;
		psh(rt,l,r);
		if(L<=mid)res=max(res, query(l,mid,L,R,ls)  );
		if(mid<R)res=max(res, query(mid+1,r,L,R,rs) );
		return res;
	}
}
namespace decom
{
	int fa[N],dep[N],dfn[N],top[N],siz[N],son[N];
	int cnt=0;
	inline void dfs1(int rt,int father)
	{
		fa[rt]=father;
		son[rt]=-1;
		siz[rt]=1;
		for(int i=head[rt]; i; i=e[i].nxt)
		{
			int to=e[i].to;
			if(to==father)continue;
			va[to]=e[i].w;
			dep[to]=dep[rt]+1;
			dfs1(to,rt);
			siz[rt]+=siz[to];
			if(son[rt]==-1||siz[son[rt]]<siz[to])son[rt]=to;
		}
	}
	inline void dfs2(int rt,int tp)
	{
		dfn[rt]=++cnt;
		top[rt]=tp;
		val[cnt]=va[rt];
		if(son[rt]==-1)return ;
		dfs2(son[rt],tp);
		for(int i=head[rt]; i; i=e[i].nxt)
		{
			int to=e[i].to;
			if(to==son[rt]||to==fa[rt])continue;
			dfs2(to,to);
		}
	}
	inline void change(int a,int b,int v)
	{
		while(top[a]!=top[b])
		{
//			cout<<a<<endl;
			if(dep[top[a]]<dep[top[b]])swap(a,b);
			seg::change(1,n,dfn[top[a]],dfn[a],1,v);
			a=fa[top[a]];
		}
		if(dep[a]>dep[b])swap(a,b);
		seg::change(1,n,dfn[a]+1,dfn[b],1,v);
		return ;
	}
	inline void add(int a,int b,int v)
	{
		while(top[a]!=top[b])
		{
//			cout<<a<<endl;
			if(dep[top[a]]<dep[top[b]])swap(a,b);
			seg::add(1,n,dfn[top[a]],dfn[a],1,v);
			a=fa[top[a]];
		}
		if(dep[a]>dep[b])swap(a,b);
		seg::add(1,n,dfn[a]+1,dfn[b],1,v);
		return ;
	}
	inline int query(int a,int b)
	{
		int res=-inf;
		while(top[a]!=top[b])
		{
			if(dep[top[a]]<dep[top[b]])swap(a,b);
			res=max(res,seg::query(1,n,dfn[top[a]],dfn[a],1) );
			a=fa[top[a]];
		}
		if(dep[a]>dep[b])swap(a,b);
		res=max(res,seg::query(1,n,dfn[a]+1,dfn[b],1) );
		return res;
	}
}
pair<int,int> id[N];

int main()
{
	freopen("P4315_1.in","r",stdin);
	freopen("ans.out","w",stdout);
	n=read();
	for(int i=1; i<n; i++)
	{
		int u=read(),v=read(),w=read();
		id[i].first=u;
		id[i].second=v;
		add(u,v,w);
		add(v,u,w);
	}
	//
	decom::dfs1(1,0);
	D
	decom::dfs2(1,1);
	D
	seg::build(1,n,1);
	D

//	for(int i=1;i<=n;i++)
//	{
//		cout<<decom::top[i]<<" "<<decom::dep[i]<<" "<<decom::siz[i]<<" "<<decom::fa[i]<<endl;
//	}
//	exit(0);

	string s;
	while(1)
	{
		cin>>s;
		if(s=="Stop") break;
		else
		{
			if(s=="Max")
			{
				int a=read(),b=read();
				cout<<decom::query(a,b)<<endl;
			}
			else if(s=="Cover")
			{
				int u=read(),v=read(),w=read();
				decom::change(u,v,w);
			}
			else if(s=="Add")
			{
				int u=read(),v=read(),w=read();
				decom::add(u,v,w);
			}
			else if(s=="Change")
			{
				int k=read(),w=read();
				decom::change(id[k].first,id[k].second,w);
			}
		}
	}
	return 0;
}
2022/10/28 19:03
加载中...