当前位置: 首页 > news >正文

洛谷 P10894

给定一棵大小为 \(n\) 的树,问能选出多少个非空的点集 \(S\),使得若 \(u, v \in S\),则 \(\text{LCA(u, v)} \in S\)

\(T\) 次查询,每次给定 \(u\),问假设删除 \(u\) 的子树后的答案是多少?

\(n, T \le 5 \times 10^5\)

先不考虑 \(T\) 组询问。这个很树形 DP,设 \(dp_u\) 表示对于 \(u\) 的子树,答案是多少。下面设 \(v \in son_u\)

  • 若不选 \(u\),只能从一个儿子继承:\(dp_v \rightarrow dp_u\)
  • 若选 \(u\),则每个子树都没有限制:\(\prod (dp_v + 1) \rightarrow dp_u\)\(+1\) 是加上空集。)

所以 \(dp_u = \sum dp_v + \prod(dp_v + 1)\)


考虑查询,实际只需要对于每个 \(u\) 都算出答案即可。具体地,算出 \(dp_u\) 对于答案(\(dp_1\))的贡献系数 \(f_u\) 即可。设 \(bro\)\(u\) 的兄弟

\[dp_{fa_u} = \sum\limits dp_{bro} + (\prod(dp_{bro} + 1) + 1)dp_{u} \]

根据这个,\(dp_u\)\(dp_{fa_u}\) 的贡献系数为 \((\prod(dp_{bro} + 1) + 1)\)\(dp_{fa_u}\) 对答案的贡献习俗为 \(f_{fa_u}\),所以 \(f_u = f_{fa_u}(\prod(dp_{bro} + 1) + 1)\)。搞个前后缀积即可。

查询的答案为 \(dp_1 - f_u \dot dp_u\)

时间复杂度:\(O(n)\)


其实设计出 \(dp_u\) 不难,主要是询问。因为是一个加乘的形式,可以想到求出每个 \(dp_u\) 对答案的贡献有多少,从 \(fa_u\) 递推即可。

http://www.jsqmd.com/news/31544/

相关文章:

  • 基本的方法
  • 2025.11.4模拟赛总结
  • 备考笔记7
  • 服务器取证基本知识学习
  • 实用指南:【18】C实战篇——C语言 文件读写【fputc、fgetc、fputs、fgets】
  • 详细介绍:常见反爬虫策略与破解方案汇总
  • 初始three.js
  • 2025 年 11 月财税合规审计报告服务商权威推荐榜:专业审计、税务合规、财务风控,企业财税合规审计报告公司精选
  • 2025 年 11 月财税合规服务厂家推荐排行榜,电商/跨境电商/出口退税/股权设计/平台报送/亚马逊/Temu/1039/海外公司/审计报告全案解决方案
  • 2025 年 11 月一般纳税人财税合规服务商权威推荐榜:专业税务筹划与合规管理解决方案深度解析
  • AI分为ANI和AGI
  • L09_ java内注解反射的简单理解(作为小白,菜鸟的理解)
  • P5369 最大前缀和
  • 奋飞咨询:以专业之光,照亮企业可持续发展通途
  • 日总结 21
  • cpp生成1到n生成全排列的三种方法
  • CF1815D
  • 南京大学/NJU 人工智能/AI 计算机系统基础/ICS 编程作业/PA 记录
  • 直播带货话术不会写?这个AI指令帮你搞定
  • Java数组——数组的使用
  • NOIP2025加训
  • 20232427 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • Windows 系统下通过 VMware 17 安装 macOS 的教程
  • 【Redis】实操:cluster集群部署
  • 2025.11.4 - A
  • 移动通信基站
  • kaggle提交 名字不是submission.csv的提交方法
  • 实用指南:【Nest】登录鉴权
  • 程序员修炼之道:从小工到专家-2
  • 设计模式--外观模式:简化繁琐环境的统一接口