[ARC108F] Paint Tree

[ARC108F] Paint Tree

前言#

复习什么的就留到下周了, 顺便把格式调好

现在把每日一练打了差不多

今天补了一下午的 T2 , 终于还是被码力问题击碎了, 不过也还好

这道题是模拟赛 T3

吉司机线段树和左偏树都只能明天搞了, 明天把 C 打了开摆

思路#

首先那几个 subtask 都没有 T2 难, 就不管了

然后就是正解思路

首先, 这种题一般要根据答案算方案数
所以我们考虑计算答案等于 d 的方案数, 至少要求出对于任意一个点, 离他的距离 >d 的点的位置

解决方法如下


题解摘抄#

先求出一条直径, 若直径的两个端点颜色相同, 则最长距离一定为直径
否则, 令两个端点分别为 x,y , 并钦定 x,y 不同色
枚举答案 d , 所有到 x 距离 >d 的点颜色必须与 y 一样, 所有到 y 距离 >d 的点颜色必须和 x 一样

考虑证明为什么要取直径的两个端点
由于 x,y 是直径的两个端点, 可以发现, 若一个点 zx,y 的距离都不超过 d , 则其到任何一个点的距离不超过 d , 所以 z 的颜色并不会对答案产生影响

所以, 定义 cnti 表示到直径两端的距离不超过 i 的点数 , 定义 fd 表示答案不超过 d 的树的形态数, gd 表示答案为 d 的树的形态数, dis1/2 表示从直径的两端点出发到其他点的距离
定义 L=max(min(dis1i,dis2i)) 的意义为, 在所有形态的树中, 最小的答案(同色点对最大距离) , 对于每个点取到直径两端点近的那个颜色即可

最终的总权值为 i=LSgi×i

容易得到 fd=2cntd
。但是我们想要答案等于 d
的树的形态数 gi
。很明显, 只需要容斥减去 fd1
即可, 也就是 gd=fdfd1

注意 x,y
共有 2
种颜色分配方案。


初步理解#

我的理解是, 你要知道对于每个点, 到他的距离 >d 的点有哪些, 从而通过确定这个点的颜色来确定到他的距离 >d 的点的颜色, 像是一个连通块的样子
然后你发现一个点是没有用的, 仅当其到任何点的距离都 d , 联想到直径

你发现确定一个点, 可以递归确定所有到某个点距离 >d 的点的颜色, 考虑怎么确定
你发现直径 (x,y) 的一个性质
如果 dis(u,v)>d , 那么一定有 dis(u,x)>d 或者 dis(u,y)>d , dis(v,x)>d 或者 dis(v,y)>d , 其中 u,v 异色, 你发现对于两个有用的点, 如果不是异色一定是同色的

具体证明一下, 如果存在 dis(u,x)>ddis(v,x)>d , 一定不存在染色, 所以不管这种情况, 还有 dis(u,y)>ddis(v,y)>d
分成两种情况讨论

  • dis(u,x)>d,dis(v,y)>d
  • dis(u,y)>d,dis(v,x)>d

发现两种情况本质相同, 只是 (u,v) 的顺序问题
我们只考虑 dis(u,x)>d,dis(v,y)>d , 也一定能考虑到所有点对 (u,v)

分类讨论之后, 你确定 x 的颜色, 就可以确定所有 u 的颜色, 确定 y 的颜色, 就可以确定所有 v 的颜色, 还是很好做的

还有一个误区是 L 的计算, 且听下回分解


最终理解#

捋一下

subtask 还是跳过, 考试的时候甚至没有想, 大体思路也如下

首先考虑一般性问题, 我们枚举答案 d , 考虑这种情况下如何分配颜色
发现任意点对 (u,v) s.t. dis(u,v)>d , 满足 u=v
这个问题怎么处理, 我们丢掉 v s.t. dis(u,v)>du 点, 容易证明的是余下的所有点一定可以被确定颜色, 记这些点的集合为 V

这里会出现一个问题, 如果让被丢掉的 u 点随意分配颜色, 那么就变成「至多」答案为 d , 我们一会再考虑这个问题

考虑剩下的点中如何处理, 特别的, 以下的讨论都仅在 V 中进行

暴力思路#

(u,v) s.t. dis(u,v)>d , 对其建边, 跑二分图染色即可
对于单个 d , 时空都是 O(n2)

具体的, 如果二分图染色出来无解那么必不存在这种情况, 否则方案数就是不在 V 里面的点随意分配颜色的方案数 ×2 , 意思是二分图的两个部分的颜色可以交换

注意这里的方案数是所有答案 d 的情况的方案数
所以需要简单容斥

我猜你想用
f(x)=i=0x(xi)g(i)g(x)=i=0x(1)xi(xi)f(i)
但是你容易发现, (xi) 是不需要的, 所以实际上只需要
f(x)=i=0xg(i)g(x)=f(x)f(x1)
注意这种做法仍然错误, 因为 f(x) 的计算显然不应该从 0 开始, 会导致答案错误, 因为本不应该出现这种情况, 处理方式见下

你发现 d 的合法性是单调的, 考虑二分 d 找到最早的合法位置记为 L , 那么 L 之前的都无解, L 之后的我们可以正常处理即可, 复杂度 O(n2logn)
然后如果一个 d 使得所有点都没有用了, 记为 R , 那么 R 之后的都是无解, R 显然是直径长度
特别的是如果 d=R , 那么可以乱放, d>R 都没有意义了

具体的, 把上面的柿子变成
f(x)=i=Lxg(i)g(x)=f(x)f(x1),x[L,R]
f(x)=2×2n|V|, xR
f(R)=2n|V|
现在只需要动态维护 i[L,R) , 符合条件的点集 V 即可
你可以用一个堆维护每个 umaxuvdis(u,v) , 复杂度 O(nlogn)

还要证明二分图联通, 因为不连通需要乘以 2cnt 而不是 2 , 其中 cnt 为连通块个数
这个是由直径的性质导出的, 假设直径两端端点为 x,y , dis(u,v)>ddis(u,x)>d or dis(u,y)>d,dis(v,x)>d or dis(v,y)>d , 因为一定有连边 (x,y) , 所以任意 (u,v) 联通, 如果没有连边(x,y) , 要么就是 d=R , 要么就无解

正解思路#

正解至少要做到 O(nlogn)

瓶颈在找 L , 考虑其意义
太神秘了不考虑了, 这题弄懂这部分通用的就行了

总结#

树上距离最大的问题, 往往可以向直径的方向转化
巧妙地地方在, 利用了直径的好性质

这种异色约束, 考虑找性质「异异得正」


常见的枚举答案算方案数的 trick
但是一定要注意答案的意义, 无意义的答案一定不能计算

这种两种状态的约束问题一定要找性质, 一般可以类似 2-\rm{SAT} 处理

容斥解决一类算重问题, 这种特殊的可以类似差分处理


复习

这个题好像很复杂的样子, 那我复习

思路#

题意

给定一棵 nn 个节点的树, 你需要对每个节点黑白染色

xx 表示白色点之间的最大距离, yy 表示黑色点之间的最大距离,那么定义一种染色的权值为 max(x,y)\max(x,y)
如果某种颜色没有出现那么对应的 x/yx/y 就是 00

求所有 2n2^n 种染色方式的权值和

公式化做题

  • 求多种方式的贡献和
    • 往往更改贡献主题, 求花费对应的操作方式个数

那么我们要计算有多少种操作方式使得 max(x,y)=d
也就是说, 对于所有 dis(u,v)>d 的点对, 都有 u=v
考虑所有这样的点对, 不难发现可以用二分图染色解决存在性, 然后方案数就是 2cnt 倍的不属于任意点对约束的点随意分配的方案数

但是这样答案是 d 的, 不一定是 d
显然需要进简单容斥, 同之前写的

因为我们要计算所有 d[L,R] 的答案, L 显然二分可知, R 就是原树上直径的长度
唯一的问题是计算不属于任意点对约束的点的个数
不难发现可以通过直径的性质去做

posted @   Yorg  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示