mxqz 树剖 TLE
查看原帖
mxqz 树剖 TLE
681036
OldDriverTree楼主2023/2/20 21:05

用 P4114 的代码稍微改了一下,结果 TLE 了,多测也清空了,应该不会是 memset 的问题吧

Code

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+1,M=2e4;
int tot,head[N],nxt[M];
int n,a[N],to[M],val[M];

void add(int x,int y,int z) {
	to[tot]=y,val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot++;
}
int size[N],fa[N],depth[N];
int cnt,id[N],son[N],top[N];

struct SGT
{
	int val[N<<2];
	#define mid (l+r>>1)
	#define pushup val[rt]=max(val[rt<<1],val[rt<<1|1])
	void update(int rt,int l,int r,int p,int x)
	{
		if (l==r) return val[rt]=x,void();
		if (p<=mid) update(rt<<1,l,mid,p,x);
		else update(rt<<1|1,mid+1,r,p,x);
		pushup;
	}
	void query(int rt,int l,int r,int L,int R,int &ans)
	{
		if (L<=l&&r<=R) return ans=max(ans,val[rt]),void();
		if (L<=mid) query(rt<<1,l,mid,L,R,ans);
		if (mid<R) query(rt<<1|1,mid+1,r,L,R,ans);
	}
}A;

int read() {
	int x=0; char ch=0;
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch&15),ch=getchar();
	return x;
}
void dfs1(int u,int f)
{
	fa[u]=f,size[u]=1;
	depth[u]=depth[f]+1;
	for (int i=head[u];~i;i=nxt[i])
		if (to[i]!=f) {
			dfs1(to[i],u),a[to[i]]=val[i],size[u]+=size[to[i]];
			if (size[to[i]]>size[son[u]]) son[u]=to[i];
		}
}
void dfs2(int u,int topf)
{
	top[u]=topf,id[u]=(++cnt);
	A.update(1,1,n,cnt,a[u]);
	if (son[u]) dfs2(son[u],topf);
	for (int i=head[u];~i;i=nxt[i])
		if (!top[to[i]])
			dfs2(to[i],to[i]);
}
int Query(int x,int y)
{
	int ans=0;
	if (x==y) return 0;
	while (top[x]!=top[y]) {
		if (depth[top[x]]<depth[top[y]]) swap(x,y);
		A.query(1,1,n,id[top[x]],id[x],ans),x=fa[top[x]];
	}
	if (depth[x]>depth[y]) swap(x,y);
	A.query(1,1,n,id[x]+1,id[y],ans);
	return ans;
}
int main()
{
	string s;
	int T=read(),x,y,z;
	while (T--) {
		n=read(),cnt=tot=0;
		memset(head,-1,sizeof head);
		memset(son,0,sizeof son);
		memset(top,0,sizeof top);
		for (int i=1;i<n;i++) {
			x=read(),y=read(),z=read();
			add(x,y,z),add(y,x,z);
		} dfs1(1,0),dfs2(1,1);
		while (cin>>s,s!="DONE")
		{
			x=read(),y=read();
			if (s=="CHANGE") {
				int tx=to[(x<<1)-1],ty=to[(x-1)<<1];
				if (depth[tx]<depth[ty]) swap(tx,ty);
				A.update(1,1,n,id[tx],y);
			} else printf("%d\n",Query(x,y));
		}
	}
	return 0;
}
2023/2/20 21:05
加载中...