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

[学习笔记]Dsu On Tree

[dsu on tree]【学习笔记】 - Candy? - 博客园

题单:

 

 

也称:树上启发式合并

可以解决绝大部分不带修改的离线询问的子树查询问题

 

流程:

1.重链剖分找重儿子

2.sol:全局用桶或者数据结构存信息。
  ①递归所有的轻儿子,回溯前删除贡献

  ②递归重儿子,不删除贡献

  ③暴力找所有轻儿子,加入贡献

  ④更新x的答案

  ⑤如果x是父亲的轻儿子,再把整个子树贡献删除(信息只有子树的,有时可以不用再dfs去重,可以直接清空)

正确性:

一个点的轻儿子会暴力更新到所有信息,重儿子链不会删除贡献,所以重儿子子树经过④之后轻儿子的贡献会保留下来,重儿子子树都有。

数据结构只会保留x子树的。

复杂度:

主要是④的暴力和⑤的删除。一个点到根的路径一共只有logn条轻边

每个轻边会额外删除一次、插入一次。总共是:O(nlogn)的

 

利用重链剖分的性质,保留重儿子的信息,轻儿子暴力更新

O(n^2)->O(nlogn)

 

好处:

(其实许多dsu的题都可以用主席树,线段树合并处理。)

1.好写

2.空间小。O(n)。全局的桶使得不用再花费logn的空间

3.可以精确打击。枚举轻儿子是把所有点再找一遍直接贡献到x上去。线段树合并和主席树就不太能精确查找。好比莫队。

4.可以处理一些有根树点分治

 

例题:

为了重儿子的信息一直适用,都是记录的绝对大小,也就是深度。

单纯和深度相关,并且边权为1的话,也可以考虑长链剖分

CF570D Tree Requests 

(这个题,可以用桶前后差分做到O(n),长链剖分也可以O(n)的)

二进制数记录某个深度的所有字符出现次数奇偶性

CF208E Blood Cousins 

倍增找到k级祖先,记录某个深度的点出现次数

CF246E Blood Cousins Return 

每个深度用set去重。

CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

有根树点分治:

CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

 

挺不错的算法

有点类似分块莫队三元环计数。用顺序和规模限制了复杂度。且这个还是一个logn

 

转载于:https://www.cnblogs.com/Miracevin/p/10505423.html

相关文章:

  • ExtJS里的Xtype的对应组件
  • 我做SAP CRM One Order redesign的一些心得体会
  • 解决ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)【亲测有效】...
  • 设计模式笔记(4)---生成器模式(创建型)
  • bootstrap
  • C语言单链表实验
  • 2018-11-10 专栏全年主题合辑-代码中文命名相关实践
  • 2009年全国软考网络规划设计师考试大纲
  • 字符串操作、文件操作,英文词频统计预处理
  • 摘抄《天龙八部》诗词回目
  • php项目命名规范
  • Jupyter Notebook不能在系统命令行里全局启动
  • php的基本内容
  • xpath获取一个标签下的多个同级标签
  • [笔记].I2C札记
  • C学习-枚举(九)
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Github访问慢解决办法
  • Invalidate和postInvalidate的区别
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java 最常见的 200+ 面试题:面试必备
  • java多线程
  • jquery cookie
  • ng6--错误信息小结(持续更新)
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring + angular 实现导出excel
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue实战(四)登录/注册页的实现
  • 初探 Vue 生命周期和钩子函数
  • 基于 Babel 的 npm 包最小化设置
  • 计算机在识别图像时“看到”了什么?
  • 近期前端发展计划
  • 免费小说阅读小程序
  • 前端攻城师
  • 使用 QuickBI 搭建酷炫可视化分析
  • 使用parted解决大于2T的磁盘分区
  • 用jQuery怎么做到前后端分离
  • 最简单的无缝轮播
  • 1.Ext JS 建立web开发工程
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C#)获取字符编码的类
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (接口封装)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 的程序集加载上下文
  • .net 托管代码与非托管代码