【题解】P5384 [Cnoi2019] 雪松果树

看到一年前的 40pts 突然想填坑,就当顺便回忆一下怎么写题解了。

思路

线段树合并 / dsu on tree / 长链剖分 / vector + 二分 / dfs 序 + 树状数组(差分)。

线段树合并

复杂度 O(nlogn),可以卡掉。

考虑用线段树合并维护每个结点的子树内所有深度的出现次数。

dsu on tree

和线段树合并同理,也可以卡掉。

长链剖分

复杂度 O(n),勉强能过。

考虑求一个结点的 k-cousin 分成:

  1. 求结点的 k-father

  2. 求该结点的 k-son 个数

第一步可以在 dfs 的时候顺便开一个 O(n) 的栈维护。

第二步是经典的长链剖分问题,直接长剖 dp O(n) 维护就行。

vector + 二分

考虑对每个深度开一个 vector,把所有该深度的结点按 dfs 序塞进去。

查询的时候直接二分左右端点数长度,复杂度也是 O(nlogn).

dfs 序 + 树状数组(差分)

转化成 dfs 序上的问题等价于问:指定的区间内有多少个数等于给定的值 k

直接 BIT 随便维护一下,复杂度也是假的。

其实不需要 BIT,考虑在 dfs 的同时维护每个深度的出现次数 cntd,查询某棵子树内深度为 d 的结点个数只需要在用遍历这棵子树前后的 cntd 差分。

时间复杂度也是 O(n),应该比长剖做法好写。

好水,但我之前为啥卡常卡了十发。

代码

写的无脑长剖做法。

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