线段树维护区间历史信息和为例的复杂信息维护同标记下传设计技巧简记

news/2025/11/6 22:00:29/文章来源:https://www.cnblogs.com/LastKismet/p/19197750
更新日志 2025/11/06:开工。

思路

单次影响与维护信息

首先考虑每一种修改操作单次对信息的影响,特殊地,将统计历史信息也视作一次操作。比如,区间加,统计区间历史信息和两种操作可以表示成:

\[sum\gets sum+v\cdot len\\ ans\gets ans+sum \]

同时,我们可以知道要维护三个信息:\(len,sum,ans\),分别表示区间长度、区间和、区间历史信息和。

设计标记与影响信息

然后我们想象,对当前区间的所有单次操作,按顺序排在一个队列里面,比如记区间加操作为 \(\mathrm A\),统计区间历史信息和操作为 \(\mathrm S\),可能有操作队列:

\[\mathrm {AAASAASASAAS}\dots \]

我们所设计的标记,其实就是提取出上面队列的关键信息以代表整个队列。

我们先考虑这整个队列中所有 \(\mathrm A\) 操作对 \(sum\) 的影响,有:

\[sum\gets sum+len\sum_{i\in Queue}[type_i=\mathrm A]v_i \]

因此我们需要维护的一个标记就是所有 \(\mathrm A\) 操作的权值之和。

然后考虑整个队列中所有 \(\mathrm S\) 操作对 \(ans\) 的影响,有:

\[ans\gets ans+\sum_{i\in Queue}[type_i=\mathrm S](sum+len\sum_{j<i}[type_j=\mathrm A]v_j) \]

拆开:

\[ans\gets ans+(\sum_{i\in Queue}[type_i=\mathrm S])\cdot sum+(\sum_{i\in Queue}[type_i=\mathrm S]\sum_{j<i}[type_j=\mathrm A]v_j)\cdot len \]

因此,我们需要维护两个标记,一个是队列中 \(\mathrm S\) 操作的数量,另一个是队列中所有 \(\mathrm S\) 操作的前缀 \(\mathrm A\) 操作权值和,也就是每一次 \(\mathrm S\) 操作当时的 \(\mathrm A\) 操作权值和之和。

整理一下:

我们需要维护三个标记,令作:

\[taga=\sum_{i\in Queue}[type_i=\mathrm A]v_i\\ cnts=\sum_{i\in Queue}[type_i=\mathrm S]\\ tags=\sum_{i\in Queue}[type_i=\mathrm S]\sum_{j<i}[type_j=\mathrm A]v_j \]

他们对信息的影响为(请注意,右式中的信息均为修改前的原值):

\[sum\gets sum+len\cdot taga\\ ans\gets ans+cnts\cdot sum+len\cdot tags \]

队列拼接与标记下传

我们考虑标记下传的意义,实际上就是把父节点的操作序列,拼接在子节点的操作序列队尾。在后面,我们为新拼接的序列信息变量名后打上 \('\) 以示区分。

我们只需要根据想象中的拼接起来的队列模拟标记值的变化即可,这一步一般是简单的,比如上面的例子,有:

\[taga\gets taga+taga'\\ cnts\gets cnts+cnts'\\ tags\gets tags+sum\cdot cnts'+tags' \]

\(tags\) 的更新相对复杂些,中间项其实就是前半部分队列的和对后半部分队列统计的前缀和产生了影响。

到这里我们就已经完成了信息维护到标记下传的所有部分的设计。

例题

以 P8868 [NOIP2022] 比赛 为例。转化就不说了,简单来说,给出两个序列 \(a,b\),我们要实现:

  • 区间加 \(a\)
  • 区间加 \(b\)
  • 维护区间历史 \(\sum a\cdot b\) 和。

让我们通过上述方法开始设计。

首先,实际上有三种操作:区间加 \(a\),区间加 \(b\),统计历史信息。可以表示成:

\[S_a\gets S_a+len\cdot v,S_{ab}\gets S_{ab}+vS_b\\ S_b\gets S_b+len\cdot v,S_{ab}\gets S_{ab}+vS_a\\ ans\gets ans+S_{ab} \]

然后想象一个序列:

\[\mathrm{ABSABASAABBSBAS\dots} \]

为了方便,我们提前设计一下两个标记以防止后面的公式长的一批:

\[T_a=\sum_{i\in Queue}[type_i=\mathrm A]v_i\\ T_b=\sum_{i\in Queue}[type_i=\mathrm B]v_i \]

以及口述一下,记 \(S_{ab}(k)\) 表示进行到第 \(k\) 次操作时的 \(S_{ab}\) 信息,\(S_a(k)\) 表示进行到第 \(k\) 次操作时的 \(S_{a}\) 信息,\(S_b(k)\) 同理。

于是有:

\[S_a\gets S_a+len\cdot T_a\\ S_b\gets S_b+len\cdot T_b\\ S_{ab}\gets S_{ab}+S_b\cdot T_a+S_a\cdot T_b+len\cdot T_a\cdot T_b\\ ans\gets ans+\sum_{i\in Queue}[type_i=\mathrm S]S_{ab}(i) \]

我们考虑拆开 \(\sum_{i\in Queue}[type_i=\mathrm S]S_{ab}(i)\)

\[ans\gets ans+\sum_{i\in Queue}[type_i=\mathrm S](S_{ab}+S_{a}(i)S_b+S_{b}(i)S_a+len\cdot S_a(i)S_b(i)) \]

整理设计标记:

\[T_a=\sum_{i\in Queue}[type_i=\mathrm A]v_i\\ T_b=\sum_{i\in Queue}[type_i=\mathrm B]v_i\\ cnts=\sum_{i\in Queue}[type_i=\mathrm S]\\ h_{a}=\sum_{i\in Queue}[type_i=\mathrm S]S_a(i)\\ h_{b}=\sum_{i\in Queue}[type_i=\mathrm S]S_b(i)\\ h_{ab}=\sum_{i\in Queue}[type_i=\mathrm S]S_{ab}(i)\\ \]

整理对四种信息的影响(同理,右式内变量为原值):

\[S_a\gets S_a+len\cdot T_a\\ S_b\gets S_b+len\cdot T_b\\ S_{ab}\gets S_{ab}+S_b\cdot T_a+S_a\cdot T_b+len\cdot T_a\cdot T_b\\ ans\gets ans+S_{ab}cnts+h_aS_b+h_bS_a+len\cdot h_ah_b \]

然后我们考虑合并序列、下传标记,比较简单,直接给出结果,记号同上:

\[T_a\gets T_a+T_a'\\ T_b\gets T_b+T_b'\\ cnts\gets cnts+cnts'\\ h_a\gets h_a+T_a\cdot cnts'+h_a'\\ h_b\gets h_b+T_b\cdot cnts'+h_b'\\ h_{ab}\gets h_{ab}+T_aT_b\cdot cnts'+T_a\cdot h_b'+T_b\cdot h_a'+h_{ab}' \]

然后就做完啦。

给出我实现的信息结构体代码:

struct node{ull len=0,sa=0,sb=0,sab=0,ans=0,ta=0,tb=0,cq=0,ha=0,hb=0,hab=0;inline void operator*=(node t){ans+=sab*t.cq+t.ha*sb+t.hb*sa+t.hab*len;sab+=t.ta*sb+t.tb*sa+t.ta*t.tb*len;sa+=t.ta*len,sb+=t.tb*len;cq+=t.cq;hab+=ta*tb*t.cq+ta*t.hb+tb*t.ha+t.hab;ha+=ta*t.cq+t.ha,hb+=tb*t.cq+t.hb;ta+=t.ta,tb+=t.tb;}friend inline node operator+(node a,node b){node c;c.len=a.len+b.len;c.sa=a.sa+b.sa;c.sb=a.sb+b.sb;c.sab=a.sab+b.sab;c.ans=a.ans+b.ans;return c;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/958141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DFS 序

思想对于树结构,通常包括进入节点和离开节点的两次记录(即时间戳),形成一个长度为2N的序列(N为节点数)。性质子树连续性‌:同一子树的节点在DFS序中形成连续区间。例如,根节点的子树区间包含所有子节点的访问记…

重组蛋白纯化标签科普:从His到SUMO、Avi的全面解析

重组蛋白纯化标签科普:从His到SUMO、Avi的全面解析在蛋白研究与生物技术服务中,重组蛋白表达 是最核心的基础技术之一。无论是科研实验、结构分析还是功能验证,获取高纯度、高活性的蛋白是实验成功的关键。为了从复…

2025.11.6

今天上午两节课,下午开团会,然后出去吃饭

飞牛nas播放卡顿的解决方案

搭建了飞牛nas,没有使用飞牛的账号,直接用的外网IP做了端口映射,前期用的还好,突然有一天,不管是网页播放视频,还是客户端播放,都变得非常卡,几乎不能用。查看后台,网络上传只有几十KB,各个部件的资源占用都…

第三十五篇

今天是11月6号,上了数据结构和体育

使用LLaMA Factory微调模型笔记

大模型微调 1、模型微调概念 大模型微调(Fine-tuning)是指在预训练的大规模语言模型基础上,针对特定任务或领域进行进一步训练的过程。预训练模型通常是在大量通用文本数据上训练得到的,具有丰富的语言知识和理解能…

25.11.6联考题解

A 一眼题。看到位运算计数考虑拆位。 B 肯定先要期望转计数,最后除掉总方案数 \((n(s+1))^m\)。最初的想法是考虑每一个位置的情况,考虑一个位置 \(x\) 受到的影响范围是 \(\text{lowbit}(x)\) 的,注意到每个位置是…

Linux驱动学习(一)---Ubuntu-helloworld驱动编译

最近想学习Linux内核驱动开发,了解了一些关于Linux的基础知识(看的B站汪晨的视频,CSDN有个博主也总结了这个视频的内容)配置了开发环境,即在windows10上安装了VMware,在VMware里安装了Ubuntu22,前面的搞定之后,…

2025/11/3 ~ 2025/11/9 做题笔记 - sb

2025/11/6 做题笔记 #9127. Optimal Train Operation 之前遗留下来的斜率优化,因为题面是英文一直没看在每一个点修建地铁站的代价是 \(a_i\),每两个地铁站之间的代价是 \((j - i + 1)\max\limits_ {i \le k \le j}c…

利用Google Dork挖掘敏感文件setup.sh的技术解析

本文详细解析了如何使用Google Dork语法"intitle:index of setup.sh"来发现互联网上公开的敏感配置文件setup.sh,这些文件可能包含服务器配置信息、数据库凭证等关键数据,对网络安全评估具有重要意义。Goo…

11.6 程序员的修炼之道:从小工到专家 第四章 注重实效的偏执 - GENGAR

这五节内容围绕编程中的容错设计、逻辑校验和资源管理展开,核心是通过科学的编码规范与工具,尽早发现问题、降低隐患,提升程序可靠性。 按合约设计(DBC)是核心校验理念,通过前条件、后条件和类不变项明确模块的权…

2025.11.6~?

2025.11.6 复盘,上午平复了一下心情 做了P2375,首先注意题中说的数量,然后发现nxt树组指的是前缀和后缀相等,数量的话,直接用nxt递推即可,然后至于不交,就维护一直不交,然后用nxt的答案即可 做了P3426,最开始…

详细介绍:自建数字资源库:技术架构全解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

人工智能价值权衡的元理论:三值纠缠与文明演进的动力学框架

人工智能价值权衡的元理论:三值纠缠与文明演进的动力学框架 摘要:随着人工智能在复杂决策中扮演日益重要的角色,其面临的核心挑战已从单纯的价值对齐转向如何在多元、动态且时常冲突的人类价值中进行权衡。本文系统…

golang面经——内存相关模块 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11/7

今天上午体育课比赛但没轮到我们组,说实话我感觉我们组如果上了应该可以拿个好名次,看完他们比赛

QOJ4795 Taxi

题意简述 给定一颗 \(n\) 个点的树,边有边权。有 \(m\) 个独立的乘客和 \(m\) 个独立的司机,每个人选一个节点。将乘客与司机匹配,使得距离之和最大。 求所有 \(n^{2m}\) 种可能情况的距离之和 \(\bmod 10^9+7\)。 …

蓝牙耳机怎么连接电脑?【图文详解】蓝牙耳机连接电脑?蓝牙耳机能连接电脑吗?USB蓝牙适配器? - 详解

蓝牙耳机怎么连接电脑?【图文详解】蓝牙耳机连接电脑?蓝牙耳机能连接电脑吗?USB蓝牙适配器? - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

AI浪潮下的就业迷思:技术迭代还是泡沫破灭?

最近刷到一堆AI相关的新闻,从OpenAI和亚马逊签下天价算力订单,到谷歌推出能预警洪水的地球级AI,再到微软自研图像模型减少对OpenAI的依赖,感觉整个科技圈都在疯狂押注AI。但作为一个学软件的学生,我反而有点焦虑:…