首页 > 其他分享 >【笔记】传统势能线段树

【笔记】传统势能线段树

时间:2024-08-13 11:38:43浏览次数:11  
标签:势能 log max 线段 笔记 修改 3.2 区间

1 引入

传统线段树能够通过打标记实现区间修改的条件有两个:

  1. 能够快速处理标记对区间询问结果的影响;
  2. 能够快速实现标记的合并。

有的区间修改不满足上面两个条件。

但存在一些奇妙的性质,使得序列每个元素被修改的次数有一个上限。

如果我们保证每暴力 \(O(\log n)\) 修改一次的时候都能修改到一个值(也就是在一个数的修改次数达到上界的时候不再修改她),那么就可以均摊 \(O(n\log\times \text{修改上限})\) 解决。

具体到实现,可以考虑在线段树每个节点上记录一个东西(需要依题而定),用来表达对应区间内是否每个元素都达到修改次数上限。区间修改时暴力递归到叶子节点,如果途中遇到一个节点,这个节点的对应区间内每个元素都达到修改次数上限则在这个节点直接 return 掉。


2 关于势能在时间复杂度计算上的应用

首先定义一个势能函数初始值就是每个元素至多被修改的次数之和。

每次操作如果势能都是不增的,那么整体的复杂度就不会超过初始势能函数的值。


3 应用

p.s. 下面都是修改操作,查询操作应该是传统线段树能做的她都能做(?

3.1 区间取模

显然每次取模每次都让原数至少减少一半,修改上限就是 \(\log V\)。

具体到实现,我们维护每个区间的最大值,如果区间最大小于模数,那么就可以不用递归下去了。


3.2 区间开方

3.2.1 Solution1 维护是不是全 \(0/1\)

首先,对于任意数开方,可以在至多 \(\log\log n\) 次内变为 \(0/1\)。

why? 其实也很好理解,因为开方一次相当于 \(\frac 12\) 方。所以就是问 $\log n $ 的最多能除 \(\frac 12\) 几次,所以就是 \(\log\log n\)。

与 3.1 类似,还是维护区间最大值就行了。


3.2.2 Solution2 维护是不是全相等

其实这道题还有一种维护方式。

直接维护区间最大值、最小值,以此来看区间是不是全部相同,如果是就直接打区间覆盖的标记。


3.2.3 区间开方,区间加法

现在我们先用势能去理解一下上面两种维护方式。

对于第一个,对于每个节点其势能函数应该是该区间还不是 \(0/1\) 的个数。

对于第二个,对于每个节点其势能函数应该是该区间不同的元素个数。

现在加上区间加之后,我们发现第一个势能函数会增加了,时间复杂度假了,但是第二个并不会!所以说,如果有区间加就只能用第二种维护方式。

但是还没完,对于这样的数据:3434,开方为 1212,再加 2 为 3434,这样就会循环。

解决办法是直接特判一下这种情况。

对于 \(\sqrt{max}=\sqrt{min}\) 的情况,打区间覆盖标记。

对于 \(\sqrt{max}=\sqrt{min}+1\) 的情况,相当于区间减 \(max-\sqrt{max}\),打区间减标记。


3.3 区间除法

与取模类似每次都让原数至少减少一半,修改上限同样也是 \(\log V\)。

注意,这里除法的结果是要数学上的向下取整的话,如果是正数最后会停在 \(0\),反之会停在 \(-1\)。

如果是用 3.2.1 的维护方式,需要分别维护区间是不是全 \(0/-1\),有点麻烦。

下面还是考虑 3.2.2。

还是特判 \(max-min=1\) 的区间.

对于 \(max/d=min/d\) 的情况,打区间覆盖标记。

对于 \(max/d=min/d+1\) 的情况,相当于区间减 \(max-max/d\),打区间减标记。


4 总结

对于常见的数学运算(比如取模就不算),一般都可以考虑 3.2.2 维护方式,即:

考虑维护 \(min,max,max-min\),然后边界情况就可以打标记,非边界递归两边。

标签:势能,log,max,线段,笔记,修改,3.2,区间
From: https://www.cnblogs.com/CloudWings/p/18356560

相关文章

  • HCIP笔记8-BGP(2)
    一、BGP的宣告问题1.在BGP协议中每台运行BGP的设备上,宣告本地直连路由2.*在BGP协议中运行BGP协议的设备还可以宣告通过IGP学习到的,未运行BGP协议设备产生的路由;在BGP协议中宣告本地路由表中路由条目时,将携带本地到达这些目标的IGP度量值;传递到BGP邻居处;其他AS设备便于选择离......
  • 极限学习笔记
    这个人太菜了,轻喷。数列极限定义数列的概念自变量为正整数的函数\(u_n=f(n)\),其中\(n=1,2,3\cdots\),将其函数值按自变量从小到大排成一列数\(u_1,u_2\cdotsu_n\cdots\),称为数列,将其简记为\(\{u_n\}\)。其中\(u_n\)称为数列的通项或者一般项。、数列极限的定义(\(\eps......
  • 【学习笔记6】论文SQLfuse: Enhancing Text-to-SQL Performance through Comprehensiv
    Abstract        Text-to-SQL转换是一项关键创新,简化了从复杂SQL语句到直观自然语言查询的转换,尤其在SQL在各类岗位中广泛应用的情况下,这一创新显得尤为重要。随着GPT-3.5和GPT-4等大型语言模型(LLMs)的兴起,这一领域得到了极大的推动,提供了更好的自然语言理解......
  • 线段树进阶 Part 1
    线段树是信息学竞赛最常见的数据结构。本篇笔记总结技巧和应用,不介绍基本线段树算法。1.常见技巧1.1信息设计用线段树解决问题,首先得考虑维护哪些信息。若不带修,任何满足结合律且封闭的信息(称为半群)都是可维护的。结合律一般都有,封闭性帮助我们设计信息。例如区间最大子段......
  • 提升效率的印象笔记(Evernote)使用指南
    印象笔记(Evernote)是一个功能强大、跨平台的笔记管理工具,它不仅能帮助你记录日常笔记,还可以用于整理工作计划、管理项目、存储灵感和信息等。为了最大化地提高你的生产力,以下将介绍一些高效使用印象笔记的技巧,帮助你充分发挥其潜力。一、入门基础:理解印象笔记的基本概念1.1笔......
  • 如何高效记录并整理编程学习笔记
    在编程学习的旅程中,好的笔记记录和整理方法不仅能帮助我们更有效地吸收知识,还能在复习时提供清晰的参考。下面,我将为您提供一些建立高效笔记系统的建议,以帮助您在繁忙学习中保持笔记的条理性,从而打造属于自己的编程学习“知识宝库”。方向一:笔记工具选择提示:1.Notion优......
  • 《软件性能测试分析与调优实践之路》(第2版) 读书笔记(一)总体介绍(上)-真正从性能分析与
    《软件性能测试分析与调优实践之路》(第2版) 是清华大学出版社出版的一本图书,作者为张永清,全书共分为9章,如下图所示 图书介绍:《软件性能测试分析与调优实践之路》(第2版) 1、为什么需要性能测试与分析1)、了解系统的各项性能指标,通过性能压测来了解系统能承受多大的并发访......
  • WSL学习笔记
    WSL学习笔记适用于Linux的Windows子系统(WSL)是Windows的一项功能,可用于在Windows计算机上运行Linux环境,而无需单独的虚拟机或双引导。WSL旨在为希望同时使用Windows和Linux的开发人员提供无缝高效的体验。本笔记主要介绍WSL2。WSL的版本区别WSL有两个版......
  • HTML并不简单读书笔记-2
    第二章a元素最简单的a标签,点击后跳转到对应的页面,再加上herf属性<ahref="http://www.w3school.com.cn">W3School</a>rel属性浏览器支持30多个rel属性下面介绍重点关注的值rel=“nofollow”这是seo的常用策略,告诉搜索引擎不要追踪这个链接。在以下两种情況下需要......
  • 【知识宝库】打造编程学习“知识宝库”:高效笔记策略与整理艺术
    在编程学习的征途上,每一位探索者都渴望拥有一座坚实的知识宝库,那里收藏着解决问题的钥匙、创新思维的火花以及深入技术的阶梯。而构建这样一座宝库,高效且系统的笔记记录与整理方法无疑是不可或缺的基石。本文将带您深入探索如何打造个性化的编程学习笔记系统,让知识不再是散落......