树剖6pts求助
查看原帖
树剖6pts求助
476767
羊叫兽同学楼主2023/2/27 18:23

rt /kel

#include<iostream>
#include<cstdio>
using namespace std;
const int aaa=1919810;
const int inf=0x7fffffff;
int n,m,s,l,i,j,v[aaa],first[aaa],nxt[aaa],dep[aaa],fa[aaa],siz[aaa],hson[aaa],tp[aaa],dfn[aaa],nfd[aaa],et,x,y,z,dfscnt,edge_u[aaa],edge_v[aaa];
struct tree
{
	int l,r,lazy,mi;
}a[aaa];
void build(int l,int r,int p)
{
	a[p].l=l;
	a[p].r=r;
	a[p].mi=a[p].lazy=inf;
	if(l==r)
		return ;
	int mid=(a[p].l+a[p].r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	return ;
}
void down(int p)
{
	if(a[p].lazy==inf)
		return ;
	int x=a[p].lazy;
	a[p].lazy=0;
	a[p<<1].mi=min(a[p<<1].mi,x);
	a[p<<1|1].mi=min(a[p<<1|1].mi,x);
	a[p<<1].lazy=min(a[p<<1].lazy,x);
	a[p<<1|1].lazy=min(a[p<<1|1].lazy,x);
	return ;
}
void change(int l,int r,int d,int p)
{
	if(l<=a[p].l&&a[p].r<=r)
	{
		a[p].mi=min(a[p].mi,d);
		a[p].lazy=min(a[p].lazy,d);
		return ;
	}
	down(p);
	int mid=(a[p].l+a[p].r)>>1;
	if(l<=mid)
		change(l,r,d,p<<1);
	if(mid<r)
		change(l,r,d,p<<1|1);
	a[p].mi=min(a[p<<1].mi,a[p<<1|1].mi);
	return ;
}
int ask(int d,int p)
{
	if(a[p].l==a[p].r)
		return a[p].mi;
	down(p);
	int mid=(a[p].l+a[p].r)>>1;
	if(d<=mid)
		return ask(d,p<<1);
	else
		return ask(d,p<<1|1);
}
void add(int a,int b)
{
	et++;
	v[et]=b;
	nxt[et]=first[a];
	first[a]=et;
	return ;
}
int dfs1(int x)
{
	siz[x]=1;
	hson[x]=-1;
	for(int i=first[x];i!=0;i=nxt[i])
	{
		if(dep[v[i]])
			continue;
		dep[v[i]]=dep[x]+1;
		fa[v[i]]=x;
		siz[x]+=dfs1(v[i]);
		if(hson[x]==-1||siz[hson[x]]<siz[v[i]])
			hson[x]=v[i];
	}
	return siz[x];
}
void dfs2(int x,int top)
{
	tp[x]=top;
	dfn[x]=++dfscnt;
	nfd[dfscnt]=x;
	if(hson[x]==-1)
		return ;
	dfs2(hson[x],top);
	for(i=first[x];i!=0;i=nxt[i])
		if(v[i]!=hson[x]&&v[i]!=fa[x])
			dfs2(v[i],v[i]);
	return ;
}
void change_tree(int x,int y,int z)
{
	while(tp[x]!=tp[y])
	{
		if(dep[tp[x]]<dep[tp[y]])
			swap(x,y);
		change(dfn[tp[x]],dfn[x],z,1);
		x=fa[tp[x]];
	}
	if(x==y)
		return ;
	if(dep[x]>dep[y])
		swap(x,y);
	change(dfn[x]+1,dfn[y],z,1);
	return ;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(i=1;i<n;i++)
	{
		scanf("%d%d",&edge_u[i],&edge_v[i]);
		add(edge_u[i],edge_v[i]);
		add(edge_v[i],edge_u[i]);
	}
	dep[1]=1;
	dfs1(1); 
	dfs2(1,1);
//	for(i=1;i<=n;i++)
//		cout<<hson[i]<<" "<<tp[i]<<" "<<dfn[i]<<" "<<dep[i]<<endl;
	build(1,n,1);
	for(;m>=1;m--)
	{
		scanf("%d%d%d",&x,&y,&z);
		change_tree(x,y,z);
	}
//	for(i=1;i<=n;i++)
//		cout<<ask(i,1)<<endl;
	for(i=1;i<n;i++)
	{
		int x;
		if(dep[edge_u[i]]>dep[edge_v[i]])
			x=ask(dfn[edge_u[i]],1);
		else
			x=ask(dfn[edge_v[i]],1);
		if(x==inf)
			x=-1;
		printf("%d\n",x);
	}
}
2023/2/27 18:23
加载中...