求助树剖TLE
查看原帖
求助树剖TLE
585805
MCRS_lizi楼主2023/1/17 13:14

RT,用了其他网址的RMJ显示TLE,不用管C++的问题。

CODE:

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<string>
#include<algorithm>
#include<functional>
#include<numeric>
#include<math.h>
#define int long long
using namespace std;
const int N=10010,inf=1e9;
int t,n,head[N],cnt,fa[N],sz[N],dfn[N],rnk[N],top[N],val[N],sum[N<<2],dep[N],son[N],tot;
struct edge
{
	int u,v,w;
}b[N];
struct sb
{
	int y,z,nxt;
}a[N<<1];
inline void init()
{
	memset(head,0,sizeof(head));
	memset(fa,0,sizeof(fa));
	memset(sz,0,sizeof(sz));
	memset(dfn,0,sizeof(dfn));
	memset(rnk,0,sizeof(rnk));
	memset(top,0,sizeof(top));
	memset(sum,0,sizeof(sum));
	memset(dep,0,sizeof(dep));
	memset(son,0,sizeof(son));
	cnt=0;
	tot=0;
}
inline void add(register int u,register int v,register int w)
{
	a[++cnt].nxt=head[u];
	a[cnt].y=v;
	a[cnt].z=w;
	head[u]=cnt;
}
inline void dfs1(register int x,register int from)
{
	fa[x]=from;
	sz[x]=1;
	dep[x]=dep[from]+1;
	for(register int p=head[x];p;p=a[p].nxt)
	{
		register int v=a[p].y,w=a[p].z;
		if(from!=v)
		{
			val[v]=w;
			dfs1(v,x);
			sz[x]+=sz[v];
			if(sz[v]>=sz[son[x]])
			{
				son[x]=v;
			}
		}
	}
}
inline void dfs2(register int x,register int from)
{
	dfn[x]=++tot;
	rnk[dfn[x]]=x;
	if(son[from]!=x)
	{
		top[x]=x;
	}
	else
	{
		top[x]=top[from];
	}
	for(register int p=head[x];p;p=a[p].nxt)
	{
		if(a[p].y!=from)
		{
			dfs2(a[p].y,x);
		}
	}
}
inline void pushup(register int x)
{
	sum[x]=max(sum[x<<1],sum[x<<1|1]);
}
inline void build(register int l,register int r,register int p)
{
	if(l==r)
	{
		sum[p]=val[rnk[l]];
		return;
	}
	register int mid=(l+r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	pushup(mid);
}
inline void update(register int x,register int k,register int ll,register int rr,register int p)
{
	if(ll>x||rr<x)
	{
		return;
	}
	else if(ll==x&&rr==x)
	{
		sum[p]=k;
		return;
	}
	else
	{
		register int mid=(ll+rr)>>1;
		update(x,k,ll,mid,p<<1);
		update(x,k,mid+1,rr,p<<1|1);
		pushup(mid);
	}
}
inline int query(register int l,register int r,register int ll,register int rr,register int p)
{
	if(ll>r||rr<l)
	{
		return -inf;
	}
	else if(ll>=l&&rr<=r)
	{
		return sum[p];
	}
	else
	{
		int mid=(ll+rr)>>1;
		return max(query(l,r,ll,mid,p<<1),query(l,r,mid+1,rr,p<<1|1));
	}
}
inline int lca(register int u,register int v)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])
		{
			v=top[v];
		}
		else
		{
			u=top[u];
		}
	}
	return dep[u]<dep[v]?u:v;
}
inline int ask(register int u,register int v)
{
	register int res=-inf;
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])
		{
			res=max(res,query(dfn[top[v]],dfn[v],1,n,1));
			v=top[v];
		}
		else
		{
			res=max(res,query(dfn[top[u]],u,1,n,1));
			u=top[u];
		}
	}
	if(dep[u]>dep[v])
	{
		swap(u,v);
	}
	return max(res,query(dfn[u],dfn[v],1,n,1));
}
signed main()
{
	std::ios::sync_with_stdio(false);std::cin.tie(0);
	cin>>t;
	while(t--)
	{
		init();
		cin>>n;
		for(register int i=1;i<n;i++)
		{
			cin>>b[i].u>>b[i].v>>b[i].w;
			add(b[i].u,b[i].v,b[i].w);
			add(b[i].v,b[i].u,b[i].w);
		}
		val[1]=-inf;
		dfs1(1,0);
		dfs2(1,0);
	
		build(1,n,1);
		string op;
		while(cin>>op)
		{
			if(op=="DONE")
			{
				break;
			}
			else if(op=="CHANGE")
			{
				register int xh,w;
				cin>>xh>>w;
				register int u=b[xh].u,v=b[xh].v;
				if(fa[u]!=v)
				{
					swap(u,v);
				}
				update(dfn[u],w,1,n,1);
				val[u]=w;
			}
			else
			{
				register int u,v;
				cin>>u>>v;
				register int c=lca(u,v);
				register int w=val[c];
				update(dfn[c],-inf,1,n,1);
				cout<<ask(u,v)<<endl;
				update(dfn[c],w,1,n,1);
			}
		}
	}
 	return 0;
}

2023/1/17 13:14
加载中...