首页 > 其他分享 >优化半群结构的线段树信息维护

优化半群结构的线段树信息维护

时间:2024-08-29 21:04:03浏览次数:4  
标签:begin end 线段 矩阵 hsum bmatrix 半群 优化 sum

今天在做区间历史和。感觉给每个标记一个含义实在太抽象了,遂听从白神建议学习矩阵维护信息和优化半群结构。

前置知识:大魔法师,用矩阵维护轮换信息。我们发现区间历史和事实上是对“历史和”变量被“和”变量轮换加法的结果,不知道为什么以前没反应过来和大魔法师有关。

区间加和区间历史和

用这个来进行举例。

我们考虑我们做区间加和区间历史和需要的信息。不难想到应该有三个:\(sum\) 表示区间现在的和,\(l\) 表示区间的长度,\(hsum\) 表示区间历史和。把它写成矩阵(或者说列向量)形如:\(\begin{bmatrix}sum \\l \\ hsum\end{bmatrix}\)。

考虑区间加操作,使用一些构造能力构造懒标记即可,很容易得到:

\[\begin{bmatrix} 1 & v & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} sum \\ l \\ hsum \end{bmatrix} = \begin{bmatrix} sum+lv \\ l \\ hsum \end{bmatrix} \]

这样就维护好了。注意我们把列向量的信息放到右边,这样每次新信息都可以利用旧信息的每一项转移。

那么也容易构造刷新历史和:

\[\begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 1 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} sum \\ l \\ hsum \end{bmatrix} = \begin{bmatrix} sum \\ l \\ hsum+sum \end{bmatrix} \]

直接用大魔法师一样的办法用矩阵乘法合并懒标记就行。注意新来的标记往旧标记的前面乘才是正确顺序。

但是这样太慢了。

我们发现矩阵里面有很多位置是没用的。我们可以通过刻画标记合并的式子来观察哪些位置是会变化的,哪些位置会是定值。比如我们发现:

\[\begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 1 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} 1 & v & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & v & 0\\ 0 & 1 & 0\\ 1 & v & 1 \end{bmatrix} \]

我们发现只有三个位置 \(A_{01},A_{20},A_{21}\) 在三个矩阵中是不一样的。其他位置都一模一样。我们把这三个位置在两个矩阵里都用字母替掉可以发现乘出来的矩阵也只有这三个位置会有变化,那么无论怎么乘下去都是这三个位置。

换而言之,一个矩阵的确定只需要这三个元素就够了。所以我们考虑优化半群结构,我们只需要设计一个和矩阵等价的运算可以维护这三个值的变化即可。我们把这三个值放回转移里面发现:

\[\begin{bmatrix} 1 & a & 0\\ 0 & 1 & 0\\ b & c & 1 \end{bmatrix} \times \begin{bmatrix} 1 & a' & 0\\ 0 & 1 & 0\\ b' & c' & 1 \end{bmatrix} = \begin{bmatrix} 1 & a'+a & 0\\ 0 & 1 & 0\\ b'+b & a'b+c+c' & 1 \end{bmatrix} \]

所以我们直接维护 \(\text{tag}=\{a,b,c\}\) 即可。注意新的运算仍然不存在交换律,打标记时需要左乘。

考虑写出矩阵和信息(那个列向量)的乘法来确定标记和信息乘在一起的形态。

标签:begin,end,线段,矩阵,hsum,bmatrix,半群,优化,sum
From: https://www.cnblogs.com/lemonniforever/p/18387546

相关文章

  • 最优化与计数
    动态规划:可以认为由状态,转移两个过程构成树上优化技巧P1272重建道路设,dp[i][j]为包含i的大小为j的连通块的最小操作次数,枚举i的每个子树一个个合并上去。考虑两个点i,j只会在lca处有计算时间贡献,所以是\(O(n^2)\)的LOJ160.树形背包先跑dfs序,设dp[i][w]为从第i个位置开始......
  • 由简到繁,常见服务器结构优化演变
            虽然,单服结构简单,但并不一定能满足需求。服务器结构设计,很多一开始是很简单的,慢慢变得越来越复杂。        个人比较反感,一上来就很复杂的做法,业务是慢慢变复杂的,服务器也应该是如此。至于,一开始简单到什么程度合适?这也得视情况而定。       ......
  • pageHelper分页插件导致的查询慢的问题优化
    首先在yml中配置mybatis:configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl会进行sql语句打印问题:进行分页查询时pageHelper自动生成的count语句相当于在查询语句外包一层selectcount(1)from(你的查询语句)对于你的查询语句的返回条件中有较......
  • 【性能优化+数据库】读写分离方案
    读写分离是一种常见的优化方案,旨在通过将读操作、和写操作分开,如下图所示:大致的原理,如下:【主库(Master)】:负责处理所有的写操作(比如:插入、更新、删除......)、和写操作相关的事务;【从库(Slave)】:负责处理读操作(查询),通过主从复制机制从主库同步数据;【复制机制】:主库将数据更改记......
  • Pytorch 中的 优化器
    1.介绍torch.optim是PyTorch库中的一个优化器模块,用于实现各种优化算法。优化器模块提供了一系列优化算法,如随机梯度下降(SGD)、Adam、Adagrad等。这些优化算法用于调整神经网络的权重和学习率,以最小化损失函数。通过优化算法,可以帮助神经网络更快地收敛到最优解,提高训练效......
  • 虚幻5|技能栏UI优化(2)——优化技能UI并实现技能栏的拖拽操作
    这篇文章里,前情提要,文章里的序列变量应命名为序号,我命名错了,虽然不差,但为了后面更好的理解一.刷新技能栏,用于刷新上一章文章的初始化技能栏1.打开技能栏格子,打开图表,添加以下两个变量并添加以下蓝图还有一个蓝图要删掉,该图片把右侧的技能图标get有效变量删掉,我这里忘删了......
  • GEE 更新和优化:利用GEE在线处理1985-2024年NDVI、EVI、SAVI、NDMI等指数归一化教程!(Lan
    简介本次的归一化教程,优化了数据去云,预处理等过程,同事将landsat5/7/8集合分别进行了数据整合,也就是原始波段的处理,从而我们可以调用1985-至今任何一个时期的影像进行归一化处理。具体的原文介绍请看原始的博客原始博客利用GEE(GoogleEarthEngine)在线处理NDVI、EVI、SAVI......
  • 线段覆盖问题
    1.线段不覆盖问题给出\(n\)个线段,选择尽量多的线段使得线段无重叠,问最多可以选多少条线段。解析考虑贪心,将线段按右端点从小到大排序,如果这条线段的左端点大于上一条线段的右端点那就选择这条线段。为什么这么贪是对的呢,因为将右端点排序可以使右边剩余的空间尽量大,那么剩余......
  • 拉格朗日插值优化 DP 做题笔记
    本来想在洛谷题单里找斜率优化DP的,然后发现了一个拉格朗日插值优化DP的题单,就点进去尝试了一下。题单。于是先看了雨兔的题解,学了CF995F的做法,然后A了这个题。雨兔题解的链接和我的代码见CF上的提交记录。现在正在做后面的题。P3643[APIO2016]划艇\(a_i,b_i......
  • Luogu P4425 转盘 题解 [ 黑 ] [ 线段树 ] [ 贪心 ] [ 递归 ]
    转盘:蒟蒻的第一道黑,这题是贪心和线段树递归合并的综合题。贪心破环成链的trick自然不用多说。首先观察题目,很容易发现一个性质:只走一圈的方案一定最优。这个很容易证,因为再绕一圈回来标记前面的和等前面的标记完之后继续走是等价的,并且再绕一圈甚至可能更劣。于是,我们只用走......