再谈 qbxt2023国庆刷题 Day7 T2 树
T2
倍增+换根即可,但赛时难写
赛时想得线段树二分,也可
回头一看老师代码,发现换根换的非常神奇,长见识了
方法0:
第一次思考,以为要记录走排名为
方法1:
xjk的思路是这样的:记
方法2:
老师的思路是这样的:对于
这么说比较难以理解,给一下代码:
void dfs2(int u){// 表示当前情况所有倍增数组都是以 u 为根的情况
for(auto i : ask[ u ]){
i.V -= b[ u ]; if(i.V < 0){ ans[ i.id ] = u; continue; }
ans[ i.id ] = e[ u ][ i.t - 1 ]; solve(ans[ i.id ], i.V);
}// 处理询问,因为当前以 u 为根, solve 里直接跳即可
for(auto v : e[ u ]){ if(v == fa[ u ]) continue; // 重点,换根
int nxt = e[ u ][ a[ u ] - 1 ]; if(v <= nxt) nxt = e[ u ][ a[ u ] ]; // 把 v 换成根时走哪个点
jp[ 0 ][ u ] = nxt;
For(i, 1, lg[ n ]){
jp[ i ][ u ] = jp[ i - 1 ][ jp[ i - 1 ][ u ] ];
sm[ i ][ u ] = sm[ i - 1 ][ u ] + sm[ i - 1 ][ jp[ i - 1 ][ u ] ];
} // 暴力重构
dfs2(v); // 递归计算
}
if(!a[ u ]) return ;
int nxt = e[ u ][ a[ u ] - 1 ]; if(fa[ u ] <= nxt) nxt = e[ u ][ a[ u ] ]; // 还原回去
jp[ 0 ][ u ] = nxt;
For(i, 1, lg[ n ]){
jp[ i ][ u ] = jp[ i - 1 ][ jp[ i - 1 ][ u ] ];
sm[ i ][ u ] = sm[ i - 1 ][ u ] + sm[ i - 1 ][ jp[ i - 1 ][ u ] ];
}
}
复杂度也是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?