代码注意事项
后面会写一些写代码时被坑惨的地方
有的坑真的很傻
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);
}
}
}

浙公网安备 33010602011771号