Codeforces 1292C Xenon's Attack on the Gangs
Description
描述
给一个 个点的树,要求你将 不重不漏的放在这 条边上,求 的最大值, 表示 的路径上所经过的边权集合中最小的没出现的非负数。
输入
第一行一个正整数 ()。
接下来 行,每行两个数 ,表示一条边(,)。
输出
一个数 表示答案。
样例
输入1
3
1 2
2 3输出1
3
输入2
5
1 2
1 3
1 4
3 5输出2
10
解释
样例1:
所以 。
样例2:
所以 。
Solution
观察一下答案式子:
是怎么推的呢?
考虑一个 ,比如它等于 ,原本它对答案只产生一次为 的贡献;现在,它对于 都会产生 的贡献,正好和还是 。
于是我们定义一个函数 ,。那么答案式子又可以化为:
说通俗一点,就是 至少包含了 的所有数的路径数量。
现在我们从 开始,依次放每一个数。比如现在我们要放 , 已经放好了,那么我们一定会把 和它们放在同一条路径上,要不然 放了以后对答案没有影响。这是因为,放在同一条路径上的话,这里的 就要变成 了;否则 已经有数字缺失,那就保持那个缺失的最小数字不变。
那么我们就可以找一个 ,它的长度为 ,我们要把 都放在这一条路上。 放的位置我们不管,因为它们不会使得答案变劣,更优的方法在后面也一定能枚举到。
想一想,一个最佳的方案一定不仅是完整的一段,而且它的一部分也要是完整的。
比如我们现在选了 :
然后 我们随便放一下:
下面我们要放 ,为了利益最大化,显然, 和 要在一起(这样我们在构造 的同时也顺便构造了一个 的路径)。
比如 放在左边:
然后我们放 ,这时我们不管放在 的左边还是 的右边,都可以顺便构成 的路径。
依次类推放完:
发现了什么?从 到 依次写下来,正好是一个 单谷序列,也就是比如把这个序列叫做 ,则有一个位置 ,使得 。
- 用 表示把 放在 上, 的最大可能值;
- 用 表示以 为根时, 为根的子树大小;
- 用 表示以 为根时, 的父亲。
现在我们要计算 ,根据单谷序列的性质, 要么在最左边,要么在最右边,那我们分类讨论一下:
- 如果 放在最左边,那么剩下的部分就是 的答案,而享受到 的路径的个数就是 ,所以 ;
- 如果 放在最右边,那么剩下的部分就是 的答案,而享受到 的路径的个数依然是 ,所以 。
综上所述:
我们可以记忆化搜索, 就可以 求了,总时间复杂度就是枚举 的 。至于 和 ,可以在之前通过枚举 ,每次 预处理出来。总时间复杂度 。
代码贴出,仅供参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 3005; int n, rt, p[N][N], s[N][N]; LL f[N][N], ans; vector< int > G[N]; void build( int u) { s[rt][u] = 1; for ( int v : G[u]) if (v ^ p[rt][u]) { p[rt][v] = u; build(v); s[rt][u] += s[rt][v]; } } LL dp( int u, int v) { if (u == v) return 0; if (f[u][v]) return f[u][v]; return f[u][v] = max(dp(u, p[u][v]), dp(v, p[v][u])) + s[u][v] * s[v][u]; } int main() { ios::sync_with_stdio( false ); cin >> n; for ( int i = 1; i < n; i++) { int u, v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } for ( int i = 1; i <= n; i++) { rt = i; build(i); } for ( int u = 1; u <= n; u++) for ( int v = 1; v <= n; v++) ans = max(ans, dp(u, v)); cout << ans << endl; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探