蒟蒻林荫小复习——关于有限制区间元素查询的一些解法

如题:本文主要说明对于区间有限制查询的一些解法(其实就两种)

问题1:给定一个数列,要求查询区间L—R中所有大于等于Va小于等于Vb的元素和

解法:

1.线段树套权值线段树

  1. 第一维维护区间,第二维作为权值线段树,维护值域在A—B之间的元素之和
  2. 每次查询就从第一维拉到对应区间,然后用Va和Vb确定在权值线段树中的查询范围即可

2.分块

  1. 分块数组记为a,对每一个a块都开一个数组b,b数组将a块中元素拷贝后排序,新建c,对于每一个b都求前缀和
  2. 这样对于整块而言,用二分确定Va和Vb在b数组中的位置Ia,Ib,那么在这个数组的贡献即为c[lb]-c[la-1].
  3. 零散部分暴力,不会超过2*sqrt(n)

问题2:在1的基础上求元素的个数

解法:

1.线段树套权值线段树

  1. 几乎同上,在第二维权值线段树中维护元素的个数即可(可能要离散化)

2.分块

  1. 分块数组记为a,对每一个a块都开一个权值数组b,b记录a中每种元素出现个数
  2. b的范围为MinV—MaxV(离散化),对于每个b新开一个c记录b数组的前缀和
  3. 假设离散化后的Va,Vb为map[Va],map[Vb],则整块的贡献为c[map[Vb]]-c[map[Va]-1]

问题3:在1和2的基础上添加修改条件:可以是删去某一个元素(正常出题人应该不会这样搞),将某一个元素的值修改

解法:

1.线段树套权值线段树

  1. 大概方法同上,内层同时维护出现次数和权值和即可
  2. 但是对于删去元素的情况,我们要记录下删去的位置,如果以后有在这个位置以后进行的操作,L和R都应当增加1(相当于问题区间整体向后移动一位腾出被删去的元素的空间)
  3. 上述的位移问题可以用一个数组来记录,每次删去后花费n的时间使删去位置后的元素++,实际操作时L和R都加上该数组中对应的元素

2.线段树套Splay(可配套阅读蒟蒻林荫小复习——Splay)

  1. 外层线段树维护区间,内层Splay同时维护元素个数和自己子树内的权值和,但是节点权值仍是该元素的权值(不是子树和)
  2. 查询时先求出Va,Vb代表的节点(如果Va和Vb不存在,就找Va的前驱和Vb的后继)将Va的前驱旋转到根,将Vb的后继旋转到Va前驱的右儿子上,这个时候我们要求的区间就是Vb后继的整个左子树
  3. 那么就可以求出上述两答案,区间合并即可
  4. 对于元素值的修改,Splay的做法是删去代表原值的点,再加入一个代表新值的点,删去元素的话依然是在最外面维护删除数组修改L和R,内层把对应元素删掉即可

3.分块套权值线段树

  1. 对于修改,再使用数组的方式就显得缓慢了
  2. 还是先维护分块数组a,内层使用权值线段树,方法同上
  3. 记录删除的数组开在区间的最外面,在询问区间L到R时直接修改L,R即可,避免把问题引入到线段树上

问题4:在1和2的基础上进行普通的区间修改(删除太毒瘤,出题人出了就等着被打死吧)

这样的话上面三种做法都要一个一个删,因为上面的做法是基于权值进行操作的,而这样的修改是基于ID的

所以说,结论是维护不了,因为每一次我们都要重做对应区间或者块的内层树。

补档:实际上是可行的

权值平衡树维护线段树,外围平衡树的每一个点代表一种点权,内层平衡树存这个点在区间L——R中出现了几次

那么对于区间修改,只需要把对应的区间在内层平衡树上拍成0(如果修改的值不和外围权值相同)或者拍成区间长度(修改的值和外围权值相同)就可以了

查询的话对于每个平衡树上的点询问其线段树在L—R上的权值即可

对于每一个点权

问题5:在1和2的基础上要求在区间L—R中对值域在Va—Vb间的每个元素进行修改

先留着吧坑

原文地址:https://www.cnblogs.com/XLINYIN/p/12275407.html

时间: 2024-08-05 20:30:54

蒟蒻林荫小复习——关于有限制区间元素查询的一些解法的相关文章

蒟蒻林荫小复习——K短路的A*解法

看标题都知道讲的是什么,但为什么特指是A*关于K短路的解法呢? 因为林荫不会其他的. 能看到这篇博客的估计也都知道K短路和A*分别是什么了吧,下面只介绍一下估价函数 由于林荫并没有经过学术训练,所以一下关于A*的理解均为感性,仅可作为OIer速成知识点时的一点资料, 切莫作为算法学术依据. 先思考一下,对于任意一条K短路,是不是均可写成由一部分最短路和一部分其他路径组成,而且这两部分路径还有且仅有一个公共点. 说明:1.任何一条路径都可以视为由其他到终点的路径和终点到终点的最短路组成 2.哪怕前

蒟蒻林荫小复习——带权并查集

实际上很早之前林荫是有这个技能的.(废话!要不直接叫小学习好了) 众所周知,并查集可以用来维护一些元素之间相连的关系(不知道的出门右转幼儿园) 而状态压缩可以使得并查集查询一对元素的关系的速度变快(O1) 状态压缩之后的并查集实际上是一个由fa数组(相当于单向链表)构成的菊花图 那么,如何用并查集来维护元素之间实际的数量关系呢? 先看一个例子: 假定现在有3个小朋友ABC,B比A大3岁,C比B大2岁.对于这个问题,如果用不带状压的并查集进行表示,那么就可以得到一条链.B到A的边权3表示 B比A大

蒟蒻林荫的小复习——主席树

主席树也就是指可持久化线段树,大致思想也就是每次利用之前的重复信息,只为被更新的一部分开辟新点.而且所谓可持久化线段树实际上是指可持久化权值线段树,线段树中每个端点存的是这个端点所代表的树的出现次数. 而在主席树的维护当中对于每个历史版本如果都开一颗新树,那么M将是最终的结局.正确解法则是为每一个改变的点分配编号而未改变的点直接链接到新树上. 下面就来从主席树的两个经典问题来考虑 1:区间第K小问题 传送门 首先分析问题,给出一个序列,每次给定一个封闭区间,求这个封闭区间以内的最小值. 上面我们

小蒟蒻初次CF滚粗+爆炸记 (Codeforces Round #466 Div.2)

比赛链接:http://codeforces.com/blog/entry/57981 小蒟蒻今天初次在ZCDHJ张大佬的带领下,打了一场CF (张大佬cnblogs链接:https://www.cnblogs.com/ZCDHJ)' 英文完全看不懂,后面几题直接放弃,各位dalao请见谅 T1: 题目链接:http://codeforces.com/contest/940/problem/A 题目大意: 给你一个n个数的集合,要求你删掉若干数,其中最大的差不应该超过d,求最小删除量. (小蒟蒻

小蒟蒻的blog美化汇总~

小蒟蒻的第一篇blog,应众多某位dalao要求,决定汇总一下blog的美化(.?∀?)ノ 1.0背景更换 1.1首先选择你喜欢的皮肤~ 1.2然后在网上照一张你喜欢的图片把它存到相册里点开图片左下角有个original image点开它复制一下网址即可 1.3上代码(页面定制) /*simplememory*/ #google_ad_c1, #google_ad_c2 {display:none;} .syntaxhighlighter a, .syntaxhighlighter div, .

关于如何食用Xcode——用mac的小蒟蒻

前言QwQ 对于一只用Mac的小蒟蒻,没有Dev_c++简直太难受了,用在线IDE写代码又没法保存,那么我们怎么办呢? 好在App Store里有这个好东西 所以我们今天来介绍一下 “如何使用Xcode” 0x00 新建文件 Step 1 :打开Xcode 会看到这样的一个界面->  Step 2 :选择中间的"Create a new Xcode project" Step 3 :一定要选macOS下的Command Line Tool (我就是因为没看到找了半天) Step

蒟蒻ACMer回忆录 · 一段弱校ACM的奋斗史

三年半的ACM生涯终于迎来了终点,退役之时,感慨万分,故写此文以纪念逝去的时光,那些为ACM拼搏的日子,那段弱校ACM的奋斗史. 三年半的ACM生涯,窝见证了CUMT从打铁到铜牌的突破,又见证了从铜牌到银牌的突破:见证了集训队员从3人发展到10余人,又见证了ACM实验室的落实. 三年半的ACM生涯,窝经历了太多,有Accepted时的欢笑,有Wrong Answer时的沮丧,有Time Limit Exceeded时的无奈,有Runtime Error时的尴尬,有打铁的失落,有拿牌的惊喜. 13

算法描述》LCA两三事(蒟蒻向)

LCA是图论中常用的解决树形结构子问题的工具,这一问题一般需要用一个简短的子函数直接解决,但是这对于广大蒟蒻们仍然是一个不小的问题. LCA是指在树形结构中两点的最近公共祖先,对于这个问题,直接向上找事最直接的方法,但同时时间复杂度和数据给出的生成树的层数有关,最优情况是logN级别的,但是如果数据给出的是一条链就GG了,所以要用更优的方法写,一般来说,用的是log2N的操作,最糟糕的复杂度也是logN级别的,那如何实现这一过程捏,我这里有两种方法,和大家分享 第一种:树上倍增 具体方法是对于已

bzoj 4636: 蒟蒻的数列

4636: 蒟蒻的数列 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想知 道N次操作后数列中所有元素的和.他还要玩其他游戏,所以这个问题留给你解决. Input 第一行一个整数N,然后有N行,每行三个正整数a.b.k. N<=40000 , a.b.k<=10^9 Output 一个数,数列中所有元素的和 Sample Input 4 2 5