Codeforces 1292C Xenon's Attack on the Gangs

Description

描述

给一个 n 个点的树,要求你将 0n2 不重不漏的放在这 n1 条边上,求 S=1u<vnmex(u,v) 的最大值,mex(u,v) 表示 <uv> 的路径上所经过的边权集合中最小的没出现的非负数。

输入

第一行一个正整数 n2n3000)。

接下来 n1 行,每行两个数 u,v,表示一条边(1u,vnuv)。

输出

一个数 S 表示答案。

样例

输入1

3
1 2
2 3

输出1

3

输入2

5
1 2
1 3
1 4
3 5

输出2

10

解释

样例1:

  • mex(1,2)=0
  • mex(1,3)=2
  • mex(2,3)=1

所以 S=0+2+1=3

样例2:

  • mex(1,3)=1
  • mex(1,5)=2
  • mex(2,3)=1
  • mex(2,5)=2
  • mex(3,4)=1
  • mex(4,5)=3

所以 S=1+2+1+2+1+3=10

Solution

观察一下答案式子:

S=1u<vnmex(u,v)=x=1n(mex(u,v)=xx)(1)=x=1n(mex(u,v)x1)(2)

(1)(2) 是怎么推的呢?

考虑一个 mex(u,v),比如它等于 y,原本它对答案只产生一次为 y 的贡献;现在,它对于 1xy 都会产生 1 的贡献,正好和还是 y

于是我们定义一个函数 F()F(x)=1u<vn[mex(u,v)x]。那么答案式子又可以化为:

S=x=1n(mex(u,v)x1)(2)=x=1nF(x)

F(x) 说通俗一点,就是 <uv> 至少包含了 0x1 的所有数的路径数量。

现在我们从 0 开始,依次放每一个数。比如现在我们要放 x0x1 已经放好了,那么我们一定会把 x 和它们放在同一条路径上,要不然 x 放了以后对答案没有影响。这是因为,放在同一条路径上的话,这里的 mex 就要变成 x+1 了;否则 0x1 已经有数字缺失,那就保持那个缺失的最小数字不变。

那么我们就可以找一个 <uv>,它的长度为 l,我们要把 0l1 都放在这一条路上。ln2 放的位置我们不管,因为它们不会使得答案变劣,更优的方法在后面也一定能枚举到。

想一想,一个最佳的方案一定不仅是完整的一段,而且它的一部分也要是完整的。

比如我们现在选了 <uv>

然后 0 我们随便放一下:

下面我们要放 1,为了利益最大化,显然,10 要在一起(这样我们在构造 0l1 的同时也顺便构造了一个 01 的路径)。

比如 1 放在左边:

然后我们放 2,这时我们不管放在 1 的左边还是 0 的右边,都可以顺便构成 02 的路径。

依次类推放完:

发现了什么?从 uv 依次写下来,正好是一个 单谷序列,也就是比如把这个序列叫做 a,则有一个位置 p,使得 a1>a2>>ap<<al1<al

  • dp(u,v) 表示把 0l1 放在 <uv> 上,i=1lF(i) 的最大可能值;
  • sroot,u 表示以 root 为根时,u 为根的子树大小;
  • proot,u 表示以 root 为根时,u 的父亲。

现在我们要计算 dp(u,v),根据单谷序列的性质,l1 要么在最左边,要么在最右边,那我们分类讨论一下:

  • 如果 l1 放在最左边,那么剩下的部分就是 dp(pv,u,v) 的答案,而享受到 0l1 的路径的个数就是 F(l)=su,v×sv,u,所以 dp(u,v)=dp(pv,u,v)+su,v×sv,u
  • 如果 l1 放在最右边,那么剩下的部分就是 dp(u,pu,v) 的答案,而享受到 0l1 的路径的个数依然是 F(l)=su,v×sv,u,所以 dp(u,v)=dp(u,pu,v)+su,v×sv,u

综上所述:
dp(u,v)=max(dp(u,pu,v),dp(pv,u,v))+su,v×sv,u

我们可以记忆化搜索,dp(u,v) 就可以 O(1) 求了,总时间复杂度就是枚举 u,vO(n2)。至于 proot,usroot,u,可以在之前通过枚举 root,每次 O(n) 预处理出来。总时间复杂度 O(n2)

代码贴出,仅供参考:

参考文献:
Akikaze.Codeforces Round #614 Editorial.CodeForces

posted @   syksykCCC  阅读(518)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示