首页 > 其他分享 >点分治维护树上修改与查询

点分治维护树上修改与查询

时间:2025-01-21 20:12:20浏览次数:1  
标签:le leftarrow 分治 查询 时间 mathcal 树上 节点

点分治维护树上修改与查询

  1. 具体方法就是将操作(修改与查询)离线,并打上时间戳,将其挂在点上,这样就可以考虑一个点到另一个点的贡献是否可以在其询问之前到达。

  2. 对于所有的点分治都要效:避免算到同一个子树中,可以先整体计算后,在分别进入每个子树中,这样就可以不使用动态开点线段树了。

例题:

有一个 \(n\) 个节点的树,每个节点上有一个集合,初始时第 \(i\) 号点的集合 \(S_i=\{i\}\),支持两种 \(m\) 次操作:

  • 1 k 查询多少个集合中含有 \(k\)

  • 2 k 对于第 \(k\) 条边连接的两个节点 \(u,v\),\(S_u\leftarrow S_v\leftarrow S_u\cup S_v\)

\(n\le 2\times 10^5,m\le 6\times 10^5\)

题解

首先将所有操作离线下来,并打上时间戳,将其挂在点上。

我们发现,在第 \(t\) 个时刻 \(S_x\) 中含有 \(y\) 的充要条件是 \(y\to x\) 有一条时间戳单增的操作 \(2\)。我们要对要对 \(x\) 求出有多少个满足条件的 \(y\)。

离线+路径计数,于是可以考虑点分治。

假设当前的重心为 \(o\),将 \(y\to x\) 的路径拆为 \(y\to o\to x\)。设 \(L_y\) 表示 \(y\to o\) 的最早到达 \(o\) 的时间, \(l_x\) 表示 \(o\to x\) 的从 \(o\) 出发的时间。发现其单调递增的一个充要条件为先 \(L_y\le l_x\) (很明显取不到等,但这样好看)。但由于要能统计进答案,设 \(t_y\) 表示这个在 \(y\) 的询问的时间,\(r_x\) 表示这条 \(o\to x\) 的到达时间,则要求 \(r_x\le t_y\)。我们有许多条 \(o\to x\) 的路径,但由于 \(l_x\) 增大的同时,\(r_x\) 也在增大,我们不得不将所有可能计入答案的 \((l_x,r_x)\) 全部记录下来。同理,一个位置 \(y\) 也会有许多询问 \(t_y\) 我们也要把他们全部记录下来。

发现变为了对于一个 \(y\),统计 \([l_x,r_x]\subset [L_y,t_y]\) 的符合条件的 \(x\) 的个数,扫描线解决。

时间复杂度:\(\mathcal O((n+m)\log^2 n)\)


如何求 \(L_y\):

因为是从 \(y\to o\) ,所以将操作按时间戳从大到小排序,对于每个操作 \(2\):

  • 若连接的其中一个节点为 \(o\),则用 \(t_i\) 更新另一个节点

  • 否则 \(L_u\leftarrow L_v\leftarrow \min(L_u,L_v)\)


如何求 \((l_x,r_x)\):

因为是从 \(o\to x\),所以将操作按时间戳从小到大排序,对于每个操作 \(2\):

  • 若连接的其中一个节点为 \(o\),则用 \(t_i\) 更新另一个节点

  • 否则 \(l_u\leftarrow l_v\leftarrow \max(l_u,l_v)\)

  • 当一个 \(l_x\) 被更新时,插入 \((l_x,t_i)\),即 \(r_x=t_i\)


关于时间复杂度:

虽然每个子树可能挂有许多节点,但每层总共还是 \(\mathcal O(m)\),总共还是只有 \(\mathcal O(\log n)\) 层,所以复杂度为 \(\mathcal O(m\log n)\)。

标签:le,leftarrow,分治,查询,时间,mathcal,树上,节点
From: https://www.cnblogs.com/lupengheyyds/p/18684354

相关文章

  • 计算机毕业设计Springboot实时校车查询微信小程序的设计与实现 基于Springboot框架的
    计算机毕业设计Springboot实时校车查询微信小程序的设计与实现3n85n858(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着城市化进程的加速和学校规模的不断扩大,校车服务已成为学生日常出行的重要方式。然而,传统的校车查询方式存......
  • 3. 使用sql查询csv/json文件内容,还能关联查询?
    1.简介我们在前面的文章提到了calcite可以支持文件系统的数据源适配,其实官方已经提供了相应的能力,其支持csv和json的查询适配,废话不多说,直接展示.2.Maven<!--calcite文件系统支持--><dependency><groupId>org.apache.calcite</groupId><artifactId>calc......
  • 分治优化DP
    分治优化DPLink\(\text{Para.1}\hspace{0.2cm}\)四边形不等式对于形如\(\text{dp}[i][j]=\min_{k<j}{\text{dp}[i-1][k]+\text{cost}[k+1][j]}\)的形式,若\(\text{cost}\)满足\(\text{cost}[a][c]+\text{cost}[b][d]\leq\text{cost}[a][d]+\text{cost}[b......
  • SQL查询最近的年、月、周、日的统计数据
    <selectid="statTraffic"resultType="com.nuorui.module.platform.domain.vo.StatTotalVO"><![CDATA[SELECTCASEWHEN#{dateType}=0THENYEAR(date_series.generated_date)--......
  • sqlite3 mysql每秒查询性能
     数据库的查询性能(如每秒查询次数,QPS,即QueriesPerSecond)取决于多种因素,包括数据库引擎、硬件配置、查询复杂度、数据量以及系统优化程度等。以下是对SQLite和MySQL每秒查询能力的比较和分析:SQLite每秒查询能力性能特点:SQLite是一个轻量级、文件系统级的数......
  • MySQL架构总览_查询执行流程_SQL解析顺序
    目录MySQL架构总览查询执行流程连接处理结果SQL解析顺序准备工作FROMWHEREGROUPBYHAVINGSELECTORDERBYLIMIT总结参考书籍MySQL架构总览架构最好看图,再配上必要的说明文字。下图根据参考书籍中一图为原本,再在其上添加上了自己的理解。从上图中我们可以看到,整个架构分为两......
  • Mybatis实现RBAC权限模型查询
    RBAC(Role-BasedAccessControl,基于角色的访问控制)是一种常用的权限管理模型,它通过角色来管理用户权限。在RBAC模型中,权限是授予角色的,用户通过扮演某些角色获得相应的权限。本文将介绍如何使用MyBatis实现RBAC权限模型的查询。一、RBAC权限模型简介核心概念用户(User) :系统的......
  • min_examined_row_limit 对慢查询日志的影响
    执行了以下一个很慢的SQL,但是在慢查询日志中却没有发现对应的SQL语句。>selectcount(*)frommyabc_abcde_expo_vv;+-----------+|count(*)|+-----------+|509600169|+-----------+1rowinset(3min3.76sec)第一反应是不是库没有开启慢查询日志的功能?于......
  • CDQ 分治 && 整体二分
    CDQ分治主要用于解决偏序问题。在偏序问题中,以三维偏序居多。它是一种离线算法。其实严格来说,它是一种思想而不是算法。它依赖于归并排序。CDQ分治也可以用于1D/1D动态规划的转移,不过目前暂不涉及。偏序问题什么是偏序?先从一维偏序说起。一维偏序给定\(n\)个点,每个点......
  • 查询SQL数据库
    问题希望从数据库获取一些数据。解决方案使用PDO::query()向数据库发送SQL查询,然后利用一个foreach循环获取每行结果。向数据库发送查询//设置数据库连接所需的用户名$user='admin';//设置数据库连接所需的密码$password='123456';//创建一个PDO实例来连接到MySQL......