首页 > 其他分享 >简单树论

简单树论

时间:2023-08-22 15:23:45浏览次数:35  
标签:分治 子树 log 树论 路径 dfs 简单 树上

cmd 的 blog 可以参考

水平不高, 内容比较简单.

内容难度不随章节单增.

0. 杂七杂八

做题做到什么东西都会扔到这里. 想到啥写啥.

  1. 如果要求统计树上所有点对之间的贡献, 可以考虑枚举 lca. (CF1856E1)

  2. 如果有类似于树上经过的边的权值 \(\leq k\) 这样的限制, 可以把边按照边权排序再往里面加. 要求是能快速算出把两个连通块连起来的贡献. (CF1857G)

  3. 如果所有询问都是从根到一个结点这样的, 可以直接在 dfs 时维护加入/撤销. (AT_abc302_h)

  4. 把一些点连起来的最小连通块: 利用虚树结论, 维护 dfs 序相邻的点, 但是写起来简单地多. (CF176E)

  5. 中途换根对子树和 lca 的影响: 分类讨论即可. (CF916E)

1. 重链剖分

用于路径/子树的修改询问.

大致思路是, 尝试用线段树来维护 dfs 序. 子树是容易的.

对于链, 如果能够让 dfs 序连续, 那也是容易的. 为了尽可能做到 dfs 序的连续, 我们每次先 dfs 重儿子, 这样形成若干条重链. 因为到根的路径可以拆成 \(O(\log n)\) 条重链, 该算法时间复杂度正确.

(过于简单, 不给例题了)

2. 树上线段树合并

直接上题目.

例 1: P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并

例 2: P6773 [NOI2020] 命运

3. dsu on tree / 树上启发式合并

不带修子树询问.

4. 长链剖分

这个东西可以 \(O(n\log n)-O(1)\) 求树上 k 级祖先, 不过用处不大.

比较重要的是, 长链剖分可以用来优化只与深度有关的 dp.

例 1: CF1009F Dominant Indices

例 2: P5904 [POI2014] HOT-Hotels 加强版

例 3: P4292 [WC2010] 重建计划

5. 点分治

一般用来统计路径.

具体操作是, 选定一个点 (树的重心), 一次做完所有经过这个点的路径, 然后只需到各个子树继续统计.

例 1: P4178 Tree

简单题. 使用点分治, 直接考虑怎么统计经过一个点的路径.
为了避免统计到两个点在一个子树里的情况, 我们可以对每棵子树, 先查它的贡献, 再加进去.
于是直接 dfs 求深度, 用个树状数组统计一下就完事了.
时间复杂度 \(O(n\log n\log k)\).

例 2: CF293E Close Vertices

实际上还有边分治这样的东西, 原理差不多, 并且只会出两个子树, 比较好讨论. 但是边分需要三度化, 很难写.

6. 单侧点分治

名字是随便起的. 直接看题.

例 1: P4886 快递员

例 2: CF566C Logistical Questions

7. 点分树

8. 虚树

用于每次询问和点集有关的问题, 这时需要一个只与点集大小相关的算法而不需要原来的树.

方法是一开始求出来每个点的 dfs 序, 然后询问的时候, 把相邻两个点的 lca 拉出来建树 (结论). 然后对着建出来的虚树进行操作即可.

9. Kruskal 重构树

标签:分治,子树,log,树论,路径,dfs,简单,树上
From: https://www.cnblogs.com/pjykk/p/17647894.html

相关文章

  • PageOffice 6 版本最简单的打开保存文件
    在OA办公、文档流转等各个Web系统中,实现最简单的打开编辑保存文件功能,调用PageOffice只需要几行代码就可以完成。后端代码在后端编写代码调用webOpen方法打开文件之前给SaveFilePage属性赋值(设置好保存时由哪个地址接口负责接收处理控件上传的文件流);PageOfficeCtrlpoCtrl=......
  • ipmitool简单使用
    以下是对`ipmitool`命令的说明:1.`ipmitoolmcinfo`:显示管理控制器(ManagementController)的信息,包括版本、固件版本、IP地址等。2.`ipmitoolsdr`:显示传感器数据记录(SensorDataRecord),包括传感器的名称、状态、读数等。3.`ipmitoolsensor`:显示传感器的当前状态,包括传感器......
  • Java_swing_边框简单实现
    ->效果->源码//:Show.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/***//显示框架*@authorcyb_23*/publicclassShow{ /** *框架 *@paramjp *@paramwidth *@paramheight */ publicstaticvoidinFrame(JPane......
  • Qt 多线程简单应用
    声明:QThread*thread;初始化:thread=newQThread();thread->start();将对象放到线程中去:moveToThread(thread);readTimer.moveToThread(thread);readTimer.setSingleShot(true);连接消亡信号:connect(thread,SIGNAL(finished()),this,SLOT(thread_done()));注......
  • spark on k8s 开发部署简单实践
    实际上就是一个简单的实践,方便参考,对于开发以及运行,集成ci/cd以及dophinscheduler任务调度为了方便开发的spark应用共享以及使用基于s3进行文件存储(当然dophinscheduler也是支持自己的资源库的)参考图 玩法说明基于gitlab进行代码管理,通过ci/cd进行sparkapp的构建,同......
  • C++遍历TypeList(可变模板参数)的简单办法
        这里例举了两种方案,一种是基于C++17的constexpr,实现起来更精简。另外一种使用传统的方式,C++11就可以用了。    另外C++11的方案也是一种计算不定参数模板参数个数的方法。#include<iostream>#include<string>//inC++17#if((defined(_MSVC_LANG)......
  • 逆向 | 简单调试器检测&调试器进程检测、虚拟机进程检测、启动路径检测、计算机名检测
    逆向|简单调试器进程检测、虚拟机进程检测、启动路径检测、计算机名检测写在自己书里的代码,丢一份到blog。简单调试器检测:#include<stdio.h>#include<windows.h>//定义枚举值constintProcessDebugPort=0x7;constintProcessDebugObjectHandle=0x1e;constint......
  • 了解AI智能问答的流程之后!使用起来更简单了
    AI智能问答流程主要是按照自然语言理解、对话管理、自然语言生成这3个步骤,通过这些步骤之后,就可以将语言进行转换,转换成计算机能够理解的意思,再根据当前对话管理判断应该采取的策略。接下来looklook会详细来讲讲具体是如何实现的。AI智能问答的流程1.自然语言理解问答机器人需要具......
  • vue实现简单表单收集
    vue实现简单表单收集实现<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><scriptsrc="......
  • Postgres入门:三种免费且简单的方法
    大家好,开发者们!今年大约有9万人参与了StackOverflow的调查。令人印象深刻的是,Postgres被评为第一数据库。此外,DBEngines还将PostgreSQL列为全球增长最快的数据库之一。这对我们意味着什么呢?很明显,我们应该努力成为PostgreSQL专家。朝这个方向迈出的一个重要步骤是设置我们自己的......