代码注意事项

后面会写一些写代码时被坑惨的地方

有的坑真的很傻

1.多测遇上线段树

此时如果我们直接像一般的单测线段树一样初始化会出现tag值不为0的情况

所以我们需要把每个节点的tag值均重新初始化

参考代码:

void build(int u,int l,int r){
	tr[u].tag=0;
	if(l==r){
		tr[u].val=0;
		return ;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(u);
}

2.当你递归dfs一直卡不过

可以改为递推实现,需要记录dfn值然后使用后序遍历
$ e.g: $

P2680 运输计划

在我们计算的时候会出现 TLE on #20 的情况只需要把计算部分的代码改为递推即可

inline void calc(int u,int fa,int cnt,ll &ans){
	for(auto t:g[u]){
		int v=t.first;ll w=t.second;
		if(v==fa)continue;
		calc(v,u,cnt,ans);
		f[u]+=f[v];
		if(f[v]==cnt){
			ans=max(ans,w);
		}
	}
}
inline void calc(int cnt,ll &ans){
	for(int i=n;i>=1;i--){
		int u=dfn[i];
		for(auto to:g[u]){
			int v=to.first;ll w=to.second;
			if(v==p[u][0])continue;
			f[u]+=f[v];
			if(f[v]==cnt)ans=max(ans,w);
		}
	}
}
posted @ 2026-05-28 20:42  dgcsjfs  阅读(31)  评论(1)    收藏  举报