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

树套树—矩阵修改,单点查询

本文主要介绍一些遇到树套树题目中矩阵修改、单点查询的做法,以及如何将问题转换成简单的模板题。

另外,如果你想看看矩阵修改,矩阵查询,可以看看这个题。

一般,如果这个修改是有逆运算(即可差分的),可以转化为 \(4\) 个差分标记,然后使用树状数组套动态开点线段树 解决。否则就只能使用二维线段树配合永久化标记解决了。

一般树套树的空间复杂度很玄学,最坏能被卡到 \(O(n \log^2 n)\),但随机数据远远够不到。所以建议能写 cdq 还是写 cdq 吧。

[APIO2019] 路灯 - 洛谷P5445

单点修改 \(a_x\),查历史有多少个时刻 \(a_l \sim a_r\) 都是 \(0\)

首先讲讲一个我想到的错误的做法。对于单点修改相当于对 \(i \sim q\) 时刻的 \(a_x\) 修改,查询相当于问时刻 \(1 \sim i\)\(\sum \limits_{u = l}^r a_u\) 的最小值以及其出现次数。然后发现根本没法做,因为修改是对一列做的,而查询却是和一行有关的,而且维护的信息也比较复杂度,树套树根本不支持维护(似乎 cdq 也不能做)。

正确的做法是将查询看成一个数对 \((l, r)\) ,维护一个答案矩阵,然后看修改会有什么影响。

对于修改,不妨设 \(a_x\)\(0\) 变成 \(1\),找到左边第一个为 \(0\)\(a_y\),以及右边第一个为 \(0\)\(a_z\)。那么对于 \(l \in(y, x], r \in [x, z)\)\((l, r)\),答案从不可行变成了可行。\(a_x\)\(1\)\(0\) 是同理的。

但是如何解决求有多少个时刻是的 \((l, r)\) 都可行呢?假设能使 \((l, r)\) 可行的是若干个区间 \([l_1, r_1), [l_2, r_2), \dots\),那么可以转化为 \(-l_1 + r_1 - l_2 + r_2 + \dots\)

从时刻 \(1\) 枚举到时刻 \(i\) 的过程中,对于那些从不可行变得可行的 \((l, r)\),相当于加入了一个左端点;从可行变得不可行的 \((l, r)\) ,相当于多了一个右端点。那么可以直接转化成一个矩阵加即可。

当然这有一个问题,可能有些 \([l_u, r_u]\) 正好被当前时刻 \(t\) 劈成两半。但这没关系,对于这种情况,\((l, r)\) 对应的值一定是负数,那么直接加上 \(i + 1\) 就是答案了。于是问题就变成了矩阵加,单点查询的问题。


使用树状数组套线段树即可。(二维树状数组开不下。或者可使用 map 之类的神秘手法离散化)

假设是对 \(x \in [xl, xr), y \in [yl, yr)\)\((x, y) + v\)。那么在 \((xl, yl), (xr, yr)\) 打一个 \(+v\) 的标记,\((xr, yl), (xl, yr)\) 打一个 \(-v\) 的标记,然后查询一个前缀矩阵的和即可。

外层树状数组中 \(bit_i\) 相当于记录 \(x \in [x - lowbit(x) + 1, x]\) 这些行的差分数组和,内层线段树就是普通的维护区间和即可。

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

[ZJOI2017] 树状数组 - 洛谷P3688

原题需特判 \(l = 1\) 的情况。

有一个长度为 \(n\)bool 数组 \(a\),最初全为 \(0\)。进行 \(T\) 次操作。

  • 随机选择 \(x \in [l, r]\),令 \(a_x\) 取反。
  • 询问 \(a_u = a_v(u < v)\) 的概率。

首先假设本来 \(a_x\)\(0\) 的概率为 \(q\)\(x\) 被抽到的概率为 \(q\)。那么执行完取反操作后 \(a_x\)\(0\) 的概率为 \(pq + (1 - p)(1 - q)\)

在这个题中, \(q = \frac{c - 1}{c}, c = r - l + 1\)。于是我们可以计算出 \(a_u, a_v = 0\) 的概率,然后就做完了。

高高兴兴的写完,然后获得了 \(6pts\) 的战绩。

问题出在哪?因为这种情况有概率出现依次取反操作中,\(a_u, a_v\) 都被取反了,这是不被允许的。(概率为 \(\frac{1}{c^2}\)

所以还是要把他们放在一起讨论。同上面那个题,把 \((u, v)\) 的答案看成一个矩阵,考虑取反操作的影响。同样还是设 \(p\),表示 \(a_u = a_v\) 的概率,不会使 \(a_u, a_v\) 关系发生改变的概率为 \(q\)\(p \leftarrow pq + (1 - p)(1 - q)\)(一次变换)。

对于 \(q\) 分三种情况(对于 \(u, v\) 至少有一个在 \([l, r]\) 的情况,其他的不用管):

  • \(q = \frac{c - 1}{c}, u \in [1, l - 1], v \in [l, r]\)
  • \(q = \frac{c - 2}{c}, u, v \in [l, r]\)
  • \(q = \frac{c - 1}{c}, u \in [l, r], v \in [r + 1, n]\)

于是就转化为了一个矩阵修改,单点查询的问题


因为这个操作有时是不可逆的(出现分母为 \(0\)),只能考虑硬打标记,使用二维线段树解决。

因为树套树不能 pushdown,所以只能标记永久化,条件是这个标记有交换律(显然交换两次操作没有变化。)

合并标记时,因为这个式子是完全对称的,所以先对 \(p, q\) 做,再对 \(p, t\) 做以及先对 \(q, t\) 做,再对 \(p, t\) 做效果相同,也就可以把比较看成 \(p = 1\) 时经过标记后变成什么。而不用搞个什么 \(p \times x + y\) 的标记。

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

相关文章:

  • AI Ping最新上线了,现在来免费用!MiniMax-M2.1、GLM-4.7,手把手教学部署与运用
  • Windows系统文件rdpserverbase.dll丢失损坏问题 下载修复
  • MySQL二进制日志(Binlog)工作机制深度解析
  • 【磁场】扩展卡尔曼滤波器用于利用高斯过程回归进行磁场SLAM研究附Matlab代码
  • python智能化智能化电子相册图片管理系统_84ds3--论文 pycharm django vue flask
  • nn.Embedding
  • 【毕业设计】基于SpringBoot和Vue的实验报告管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 基于springboot服装商店管理与分析系统(毕设源码+文档)
  • 【RTOS】智能家居-中间层
  • 2017-基于非支配排序鲸鱼优化(NSWOA)算法的多阈值图像分割(Otsu 法 + 最大熵法 + 最小交叉熵)(中文核心、SCI 四区可选)
  • Linux的WDT子系统简析
  • ARM 汇编指令:PUSH 和 POP
  • 反向海淘火了!它到底解决了海淘的哪些痛点?
  • 12/24
  • 图解Hibernate的工作流程 (高清,共7步)
  • 排序|倒序遍历|set
  • python私人健身和教练预约管理系统--论文pycharm django vue flask
  • FPGA基础知识(二十一):xilinx FPGA中常用的原语
  • Google与OpenAI绘图工具遭滥用,阿里巴巴开源语音模型,知乎发布AI产品榜单,Jan团队发布Jan-v2-VL-Max
  • Alpha阶段项目复审报告
  • 基于PLC的交通灯控制系统设计红绿灯控制博图组态仿真
  • Python第三阶段——PySpark
  • pq|dfs|快排
  • 2025最新!8个AI论文软件测评:研究生写论文痛点全解析
  • Dify 本地开发:前端代理转发解决 401 问题
  • 基于SpringBoot家教中介管理系统(毕设源码+文档)
  • 镜像的创建
  • NX ①添加GC工具箱 ②制图绘制中心线 ③制图倒斜角标注C ④更新重量
  • DPJ-141 基于stm32f103控制器的GPRS定位追踪器设计(源代码+proteus仿真)
  • 事后诸葛分析