树剖 6pts Wa 求助 悬关
查看原帖
树剖 6pts Wa 求助 悬关
347664
菲斯斯夫斯基楼主2023/8/18 21:28

rt。谢谢。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+10;
struct ccf
{
	int mi,la;
}t[N<<2];
int n,m,l;
int de[N],dfn[N],son[N],s[N],tp[N],a[N],b[N],f[N];
vector<int>v[N];
void dfs1(int x,int fa)
{
	f[x]=fa;
	s[x]=1;
	de[x]=de[fa]+1;
	int ma=0;
	for(int i=0;i<v[x].size();i++)
	{
		int to=v[x][i];
		if(to==fa)continue;
		dfs1(to,x);
		s[x]+=s[to];
		if(s[to]>ma)
			ma=s[to],son[x]=to;
	}
}
void dfs2(int x,int top)
{
	tp[x]=top;
	dfn[x]=++l;
	if(!son[x])return ;
	dfs2(son[x],top);
	for(int i=0;i<v[x].size();i++)
	{
		int to=v[x][i];
		if(to==f[x]||to==son[x])continue;
		dfs2(to,to);
	}
}
void push_down(int k)
{
	int l=k*2,r=k*2+1;
	t[l].la=min(t[l].la,t[k].la);
	t[r].la=min(t[r].la,t[k].la);
	t[l].mi=min(t[l].mi,t[k].la);
	t[r].mi=min(t[r].mi,t[k].la);
	t[k].la=1e18;
}
void change(int k,int l,int r,int x,int y,int z)
{
	if(l>y||r<x)return ;
	if(x<=l&&r<=y)
	{
		t[k].mi=min(t[k].mi,z);
		t[k].la=min(t[l].la,z);
		return ;
	}
	push_down(k);
	int mid=(l+r)/2;
	change(k*2,l,mid,x,y,z);
	change(k*2+1,mid+1,r,x,y,z);
}
int ask(int k,int l,int r,int x)
{
	if(l>x||r<x)return 1e18;
	if(l==r&l==x)return t[k].mi;
	push_down(k);
	int mid=(l+r)/2;
	return min(ask(k*2,l,mid,x),ask(k*2+1,mid+1,r,x));
}
void add(int x,int y,int z)
{
	while(tp[x]!=tp[y])
	{
		if(de[tp[x]]<de[tp[y]])
			swap(x,y);
		change(1,1,n,dfn[tp[x]],dfn[x],z);
		x=f[tp[x]];
	}
	if(de[x]>de[y])
		swap(x,y);
	if(x==y)return ;
	change(1,1,n,dfn[x]+1,dfn[y],z);
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<n;i++)
	{
		cin>>a[i]>>b[i];
		v[a[i]].push_back(b[i]);
		v[b[i]].push_back(a[i]);
	}
	dfs1(1,1);
	dfs2(1,1);
	for(int i=1;i<=4*n;i++)
		t[i].mi=t[i].la=1e18;
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
	}
	for(int i=1;i<n;i++)
	{
		if(de[a[i]]<de[b[i]])
			swap(a[i],b[i]);
		int k=ask(1,1,n,dfn[a[i]]);
		cout<<(k==1e18?-1:k)<<endl;
	}
	return 0;
}
2023/8/18 21:28
加载中...