10.15【A】

2913

暴力遍历,on^3

最暴力的方法就是,枚举起点,然后枚举长度,之后维护内部出现的元素

但肯定还有更好的方法

线段树

如果这个题用线段树的话,是给定了一个固定的区间Nums,每个节点表示其所对应的区间上有多少个不一样的元素,每个叶子的值就是1;那关键在于怎么合并?以及最终查询,求和结果时如何求?

本题示例

过程就是不断枚举右端点,然后去区间更新线段树的值,等右端点枚举完了,结果就好了

首先对于线段树,其下标均为可能的左端点

然后在枚举右端点的时候,就是要去更改不大于它的所有线段树叶子,即合法的左端点,区间修改

枚举右端点,检查其值x,如果之前出现过,那么寻找其最后一次出现的位置prev,那么对于它之后的所有位置,x都相当于是最后出现的位置,都可以使其dl+1,而对前面出现过的位置,有他没他不影响值的更改,不变,所以是要区间批量修改prev+1,r

这样在枚举右端点时就会不断更新所有可能的区间,和直观理解的按区间长度来不断枚举的过程是不一样的,这个枚举右端点的过程,相当于是先固定一个端点再枚举长度来更新,只不过是批量的区间更新;然后按长度更新,就是枚举起点,然后再枚举长度更新

AI实现

这边参数是区间编号(保留这个参数是为了取值,即从线段树数组当中拿值出来)

对应原数组当中的左右端点(物理含义,但凭这个是找不到线段树当中的值的)

查询区间,以及更新值(这个题固定是1,所以也可以不要)

prev+1应当<=r,即至少是保留了r的一个情况,这个情况也是必然需要更改的

也就是说当调用update的时候,是一定会发生更改的,即判断是否应该更改的任务,不应该放在update方法里;调用Update时,至少会更改r的一种情况,即单点修改,左端点靠前,即prev+1<r时,就可能会修改多个情况(也包含了只有r时的情况)

以及最后的答案,由于是在枚举右端点,所以当右端点发生改变时,整个树上各节点的物理含义也会随之发生改变,不过既然如此,对于不同的右端点,线段树为什么都还是同一个?不该是每个右端点都对应一个自己的线段树吗?

就是说,在物理含义上,当枚举r时,对每个不同的r,线段树的物理含义确实不同,也确实可以说是不同的线段树,但当前r的线段树,可以由上个r-1的线段树简单地得到

然后最终的结果,就是这n个线段树最顶层区间结果的加和

复习线段树

对于区间修改,就是对所查询的那个区间,拼起来集体修改,如果要查询到单点,那就是查该单点时路过的所有区间落实修改,相当于修改延后,但也可能不会真的落实,以及可能会将多个区间修改合并在一起

相关推荐
w_zero_one2 小时前
递归算法(一)
java·开发语言·算法
风影同志783243 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG4 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
地平线开发者4 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者5 小时前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品
youshi66685 小时前
PID——算法改进
算法
一只不想敲代码的程序猿6 小时前
如何更高效地拆解问题?
算法
微尘hjx7 小时前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort
梦帮科技7 小时前
意识启发式量子隧穿退火算法用于全局优化 (CITA) 完整技术指南
网络·人工智能·算法·量子计算·模拟退火算法
一去不复返的通信er9 小时前
排序 + 双指针:力扣15三数之和
算法·leetcode