MnZn 树剖 0 分求调
查看原帖
MnZn 树剖 0 分求调
358739
BFSDFS123楼主2022/11/22 10:55

RT,感觉很没有问题,但是却有很大问题

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define eps 1e-8
const int inf=0x3f3f3f3f;
const int Maxn=1e5+10;
int siz[Maxn],son[Maxn],dep[Maxn],fat[Maxn];
int dfsTime;
int dfn[Maxn],Top[Maxn];
int head[Maxn],tot;
struct Edge{
	int to;
	int nxt;
}E[Maxn<<1];
void addedge(int u,int v)
{
	tot++;
	E[tot].to=v;
	E[tot].nxt=head[u];
	head[u]=tot;
}
void dfs1(int u,int fa)
{
	dep[u]=dep[fa]+1;
	fat[u]=fa;
	siz[u]=1;
	for(int i=head[u];i;i=E[i].nxt)
	{
		int v=E[i].to;
		if(v==fa) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]])
		{
			son[u]=v;
		}
	}
}
int Ar[Maxn];
void dfs2(int u,int tp)
{
	Top[u]=tp;
	dfn[u]=++dfsTime;
	if(!son[u])
	{
		return ;
	}
	dfs2(son[u],tp);
	for(int i=head[u];i;i=E[i].nxt)
	{
		int v=E[i].to;
		if(v==fat[u] || v==son[u]) continue;
		dfs2(v,v);
	}
}
struct segtree{
	int maxx;
	int tag1; // 加法tag 
	int tag2; // 赋值tag 
}t[Maxn<<2];
#define ls node<<1
#define rs node<<1|1
void pushup(int node)
{
	t[node].maxx=max(t[ls].maxx,t[rs].maxx);
}
void pushdown(int node)
{
	if(t[node].tag2>=0)
	{
		t[ls].maxx=t[node].tag2;
		t[rs].maxx=t[node].tag2;
		t[ls].tag2=t[node].tag2;
		t[rs].tag2=t[node].tag2;
		t[ls].tag1=0;
		t[rs].tag1=0;
		t[node].tag2=-1;
	}
	if(t[node].tag1)
	{
		t[ls].maxx+=t[node].tag1;
		t[rs].maxx+=t[node].tag1;
		t[ls].tag1+=t[node].tag1;
		t[rs].tag1+=t[node].tag1;
		t[node].tag1=0;
	}
	
}
void build(int node,int l,int r)
{
	t[node].tag2=-1;
	if(l==r)
	{
		t[node].maxx=Ar[l];
//		cout<<"seg:"<<node<<":"<<Ar[l]<<endl;
		t[node].tag2=-1;
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(node);
}
void modify(int node,int l,int r,int ql,int qr,int val) // 区间赋值 
{
	if(ql<=l && r<=qr)
	{
		t[node].maxx=val;
		t[node].tag2=val;
		t[node].tag1=0;
		return ;
	}
	pushdown(node);
	int mid=(l+r)>>1;
	if(ql<=mid)
	{
		modify(ls,l,mid,ql,qr,val);
	}
	if(qr>mid)
	{
		modify(rs,mid+1,r,ql,qr,val);
	}
	pushup(node);
}
void update(int node,int l,int r,int ql,int qr,int val) // 区间加
{
	if(ql<=l && r<=qr)
	{
		t[node].maxx+=val;
		t[node].tag1+=val;
		return ;
	}
	pushdown(node); 
	int mid=(l+r)>>1;
	if(ql<=mid)
	{
		update(ls,l,mid,ql,qr,val);
	}
	if(qr>mid)
	{
		update(rs,mid+1,r,ql,qr,val);
	}
	pushup(node);
}
int query(int node,int l,int r,int ql,int qr)
{
//	cout<<node<<" "<<l<<" "<r<<" "<<ql<<" "<<qr<<":";
	if(ql<=l && r<=qr)
	{
//		cout<<t[node].maxx<<endl;
		return t[node].maxx;
	}
	pushdown(node);
	int maxx=-0x3f;
	int mid=(l+r)>>1;
	if(ql<=mid)
	{
		maxx=max(maxx,query(ls,l,mid,ql,qr));
	}
	if(qr>mid)
	{
		maxx=max(maxx,query(rs,mid+1,r,ql,qr));
	}
	return maxx;
}
int n;
struct Edges{
	int u,v,w;
};
vector<Edges> ev;
void cover(int u,int v,int w)
{
	while(Top[u]!=Top[v])
	{
		if(dep[Top[u]]<dep[Top[v]])
		{
			swap(u,v);
		}
		modify(1,1,n,dfn[Top[u]],dfn[u],w);
		u=fat[Top[u]];
	}
	if(dfn[u]>dfn[v])
	{
		swap(u,v);
	}
	if(dfn[u]+1!=dfn[v])
	{
		modify(1,1,n,dfn[u]+1,dfn[v],w);
	}
}
void add(int u,int v,int w)
{
	while(Top[u]!=Top[v])
	{
		if(dep[Top[u]]<dep[Top[v]])
		{
			swap(u,v);
		}
		update(1,1,n,dfn[Top[u]],dfn[u],w);
		u=fat[Top[u]];
	}
	if(dfn[u]>dfn[v])
	{
		swap(u,v);
	}
	if(dfn[u]+1!=dfn[v])
	{
		update(1,1,n,dfn[u],dfn[v],w); 
	}
}
int Max(int u,int v)
{
	int ans=-0x3f; 
	while(Top[u]!=Top[v])
	{
		if(dep[Top[u]]<dep[Top[v]])
		{
			swap(u,v);
		}
//		cout<<u<<" "<<v<<endl;
//		cout<<dfn[Top[u]]<<" "<<dfn[u]<<endl;
		ans=max(ans,query(1,1,n,dfn[Top[u]],dfn[u]));
		u=fat[Top[u]];
	}
	if(dfn[u]>dfn[v])
	{
		swap(u,v);
	}
	if(dfn[u]+1!=dfn[v])
	{
		ans=max(ans,query(1,1,n,dfn[u]+1,dfn[v]));
	}
	return ans;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		ev.push_back((Edges){u,v,w});
		addedge(u,v);
		addedge(v,u);
	}
	dfs1(1,0);
	dfs2(1,1);
	for(int i=0;i<n-1;i++)
	{
		int u=ev[i].u,v=ev[i].v,w=ev[i].w;
		if(dep[u]<dep[v])
		{
			swap(u,v);
		}
		Ar[dfn[u]]=w;
//		cout<<dfn[u]<<":"<<w<<endl;
	}
	build(1,1,n);
	while(1)
	{
		string str;
		cin>>str;
		if(str=="Stop") return 0;
		if(str=="Change")
		{
			int k,x;
			scanf("%d%d",&k,&x);
			int u=ev[k-1].u,v=ev[k-1].v;
			if(dep[u]<dep[v])
			{
				swap(u,v);
			}
			modify(1,1,n,dfn[u],dfn[u],x);
		}else if(str=="Cover"){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			cover(u,v,w);
		}else if(str=="Add"){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			add(u,v,w);
		}else{
			int u,v;
			scanf("%d%d",&u,&v);
			printf("%d\n",Max(u,v));
		}
	}
	return 0;
}

2022/11/22 10:55
加载中...