[POI2014]HOT-Hotels 加强版 解题报告
长链优化 DP 好题。
考虑朴素的 dp,可以先手模几组数据,发现满足要求的三元组类似下图:
因此,假设当前点为
可以得出如下转移:
g[u][j + 1] += f[v][j] * f[u][j + 1];
g[u][j - 1] += g[v][j];
f[u][j + 1] += f[v][j];
避免算重,答案应该在合并
ans += f[u][j - 1] * g[v][j];
ans += f[v][j] * g[u][j + 1];
朴素转移时间、空间复杂度均为
在
我们注意到转移只关心距离,而在树上,距离与深度相关,考虑用长链剖分与指针结合均摊复杂度。
注意到
将整棵树长链剖分后,一条长链上的部分可以
代码只给出 dp 部分,f,g
为指针数组,dep_son
为长儿子,cur
为指针,fur
为从长链底到
il void dfs2(int u, int fa) {
// cerr << u << endl;
if (dep_son[u])
f[dep_son[u]] = f[u] + 1, g[dep_son[u]] = g[u] - 1, dfs2(dep_son[u], u);
f[u][0] = 1; ans += g[u][0];
for (int v : Es[u]) {
if (v == fa || v == dep_son[u]) continue;
f[v] = cur; cur += fur[v] << 1; g[v] = cur; cur += fur[v] << 1;
dfs2(v, u);
for (int i = 0; i < fur[v]; ++i) {
if (i) ans += f[u][i - 1] * g[v][i];
ans += g[u][i + 1] * f[v][i];
}
for (int i = 0; i < fur[v]; ++i) {
g[u][i + 1] += f[u][i + 1] * f[v][i];
if (i) g[u][i - 1] += g[v][i];
f[u][i + 1] += f[v][i];
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)