Preview:

个人认为是一套非常好的题单,能在各个方面练习 DS 水平,并且很多题型也是比赛当中的经典题

题单链接

Challenge 0:

简单的数组,懒得写了。

Challenge 1:

考虑每一次修改所带来的的影响,因为修改是直接对上一个版本而不是任意一个版本进行修改,所以我们可以让每一个位置维护一个 vector,当我们修改某个位置时,就把操作序号和修改的值 push_back 进 vector 里面,然后查询第几次操作时某位置的值就变成了在 vector 上面二分。时间复杂度 \(O(M \log |opt|)\)

Challenge 2:

主席树,但是大型动态开点现场。

我们对于操作二,可以理解为在当前最新版本查询第 \(x\) 个元素。

对于操作三,我们可以理解为 copy 相对于第 \(x\) 前版本,使之成为最新版本。

至于操作一,我们可以预先分配好 \(1e5\) 长度的序列,然后加减数就是动态开点式添点,因为我们的加是直接在尾部添加,所以我们每个叶子结点只需要两个信息:当前值和元素个数,然后 \(\text{pushup}\) 元素个数就行了。

Challenge 3:

线段树板子题,懒得记录了。

Challenge 4:

有两种思路,先说第一种:

对于操作 \(2\),我们可以观察一下,发现其本质是区间和的平方减去区间平方和再除以 \(2\),所以让线段树维护区间和和区间平方和就可以了。

至于操作 \(3\) 嘛,因为只是单点修改,所以怎么乱搞都可以过。

第二种是机房 \(\text{gxd}\) 大神提出来的(膜拜大神 \(\text{gxd}\)):

对于一个区间,我们维护两个值,分别是两两相乘的值和区间和,对于区间的合并,我们则有:

\[\text{合并出来的区间 = 原先两个区间的两两相乘值 + 两个区间的区间和相乘}
\]

然后就做完了,毕竟是单点改,所以修改操作也是 \(O(M \log n)\) 的。

以上两种的时间复杂度都是 \(O(n \log n)\)

Challenge 5:

也是线段树板子题,不过 \(\text{lazytag}\) 下传的时候要考虑一下 \(\text{lazytag}\) 是否真的存在。

或许珂朵莉树也是个不错的选择?

Challenge 6:

(前言:楼房重建的翻版)

喵喵题,所有的喵喵之处全在 \(\text{pushup}\) 上了,其余的和板子一样。

对于本题,\(\text{pushup}\) 应该依照一下逻辑:

  1. 若当前区间的最大值小于 \(cmax\),则直接返回 \(0\)
  2. 若当前区间为叶子,则返回 \(cmax < seg[p].max\)
  3. 若当前区间的第一个元素大于 \(cmax\),则直接返回该区间的贡献。
  4. 若当前区间的左儿子的最大值小于等于 \(cmax\),则递归到右儿子
  5. (重点)若当前区间的左儿子最大值大于 \(cmax\),则递归到左儿子,此时右儿子的贡献则为 \(pushup(cmax,p<<1)+seg[p].data - seg[p<<1].data\)。

可能第五点不大好理解,这里详细说一下:

因为右儿子中有贡献的一定大于左儿子的最大值,所以我们无论左儿子中哪些数做出了贡献,右儿子那些有贡献的数必定已然拥有贡献,而且我们保证,若左儿子拥有贡献,则提供贡献的肯定包含左儿子的最大值,因为右儿子有贡献的必定大于左儿子的最大值,所以易证右儿子的贡献可以全部加上。

然后就是一个线段树单点修改的板子。

Challenge 7:

有两种思路,我们先说第一种:

用 \(\text{unordered\_map}\) 开个桶,然后顺便记录一下原序列,则此时更改序列某一个元素就变成了将桶中原来那个数的位置 \(-1\),修改后的数的位置 \(+1\)。

查询直接 \(\text{unordered\_map}\) 映射过来就好。

操作的时间复杂度近似于 \(O(1)\),但是不保证毒瘤出题人是否会卡你 \(\text{unordered\_map}\),所以换成 \(\text{map}\) 的话更稳妥但此时复杂度上升至了 \(O(\log n)\).

第二种思路和第一种一样,但是鉴于原题建议 \(\text{C++}\) 选手不要用 \(\text{STL}\),则我们可以用平衡树或者值域线段树来代替 STL。

时间复杂度 \(O(M \log n)\)

Challenge 8:

刚开始被唬了一跳,然后立马调整过来了。

一道非常不错的 “贪心+平衡树+堆+哈希表”

我们分析一下,当一个数插入进来的时候,在当前数列中与哪些数之间的差特别小,显然,肯定是与他的前驱或者后继相差最小。

于是维护一颗平衡树(实际上我用的是 \(\text{set}\),因为感觉自己写的容易 T 飞 ),他的作用主要是来查询当前待插入值得前驱后继。

那么对于差,我们维护一个小根堆(\(\text{priority\_queue}\)),此时显然堆顶就是我们想要的答案。

那么删除操作该怎么办呢,因为优先队列无法做到精准定位删除,所以我们可以让关于优先队列的删除操作在查询时完成,为了标记我们需要删除的值,我们还应当维护一张哈希表(\(\text{unordered\_map}\)),用来记录有哪些差值需要被删除多少次。

注意:

  1. 当我们删除一个值的时候,应当将他的前驱和后继的差再 \(\text{push}\) 进去,否则会少信息。
  2. 当我们插入一个值得时候,应当先找前驱后继再插入,否则会增加代码量或者有一定概率 G 掉

时间复杂度应该是个摊还分析,不会,盲猜 \(O(n \log n)\)

关于删除操作还有另外两种思路(全部来自于 \(\text{do\_while\_true}\),在这里万分感谢他):

  1. 使用 \(\text{multi\_set}\),作用和优先队列差不多(抛开对比优先队列的常数),但是支持迭代器 \(\text{erase}\),删除的时候直接 \(\text{lower\_bound} + \text{erase}\),查询最小只需要 \(\text{begin}\) 就行了。时间复杂度依旧是 \(O(M \log n)\)
  2. 可删堆的思路,似乎常数更小?均摊下来依旧是 \(O(M\log n)\)

Challenge 9:

一道非常经典的 trick 好题

我们将每个线段树节点维护两个信息,分别是当前位置的数字和当前区间的有效元素个数,此时删除操作就变成了减少某个位置的有效元素个数,查询操作就变成了用当前的有效元素个数信息来凑出第 \(k\) 个数。

Challenge 10:

值域线段树或平衡树,原理同 Challenge 9。

注意查询右子树的时候应该是 \(k - \text{左子树的cnt}\)

Challenge 11:

主席树板子(雾),没啥技术含量(大雾),只要对线段树足够了解可以直接现魔改。

Challenge 12:

主席树板子二……

拓展:如果带单点修改怎么办

即答:主席树套树状数组

CDQZ DS 题单总结(上)的更多相关文章

  1. 【DP_树形DP专题】题单总结

    转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...

  2. 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)

    模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...

  3. LCT总结——应用篇(附题单)(LCT)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--概念篇戳这里 题单 灰常感谢XZY巨佬提供的强力资磁!(可参考XZY巨佬的博客总结) 题单对于系 ...

  4. AC自动机题单

    AC自动机题目 真的超级感谢xzy 真的帮到我很多 题单 [X] [luogu3808][模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P38 ...

  5. LCT题单(自己的做题情况反馈)(转自Flash)

    LCT题单(自己的做题情况反馈)(转自Flash) 随时进Flash Hu的LCT看一发 也可以看一下我自己的风格的板子 开始 维护链信息(LCT上的平衡树操作) [X] 洛谷P3690 [模板]Li ...

  6. tp5 ajax单文件上传

    HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(56)-插件---单文件上传与easyui使用fancybox

    系列目录 https://yunpan.cn/cZVeSJ33XSHKZ  访问密码 0fc2 今天整合lightbox插件Fancybox1.3.4,发现1.3.4版本太老了.而目前easyui 1 ...

  8. asp.net.mvc 的单文件上传和多文件上传的简单例子

    首先打开vs2012,创建空的mvc4项目,名称为MVCStudy,选择基本模板

  9. php文件上传之单文件上传

    为了简单一些,php文件跟form表单写在了一个文件里. php单文件上传----> <!DOCTYPE html> <html> <head> <me ...

  10. Struts2实现单文件上传

    首先配置一下web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi ...

随机推荐

  1. Kafka主从模式和故障切换

    Kafka集群有主从模式吗? Kafka集群实际上并没有严格意义上的主从模式.Kafka的设计是基于分布式的,每个Topic都会切分为多个Partition,每个Partition都有一个Leader ...

  2. python教程 入门学习笔记 第3天 编程基础常识 代码注释 变量与常量

    编程基础常识 一.注释 1.对代码的说明与解释,它不会被编译执行,也不会显示在编译结果中 2.注释分为:单行注释和多行注释 3.用#号开始,例如:#这是我的第一个python程序 4.注释可以写在单独 ...

  3. python爬虫抓取图片

    一.什么是爬虫 什么是爬虫?爬虫是蜘蛛么?是八爪鱼么?nonono. 爬虫是指请求网站并获取数据的自动化程序,又称网页蜘蛛或网络机器,最常用领域是搜索引擎,最常用的工具是八爪鱼. 它的基本流程分为以下 ...

  4. 番外1.ssh连接管理器

    目录 本篇前瞻 项目背景 ssh连接管理器 优点 使用方式 配置 使用方法 快速开始 注意点 使用样例 本篇后记 本篇前瞻 学习完go语言基础的专栏,我们究竟写出怎么样的实用工具呢?我在github上 ...

  5. svg动画 - 波浪动画

    波浪 <path d="M 96.1271 806.2501 C 96.1271 806.2501 241.441 755.7685 384.5859 755.7685 C 529.8 ...

  6. P3378 【模板】二叉堆

    [洛谷]P3378 [模板]堆 方法一 手写堆 最小堆插入 从新增的最后一个结点的父结点开始,用要插入元素向下过滤上层结点(相当于要插入的元素向上渗透) void siftdown(int i) // ...

  7. Vue源码学习(一):数据劫持(对象类型)

    好家伙,了解一下Vue如何实现数据劫持 1.Vue中data的使用 首先,我得搞清楚这玩意的概念,我们先从vue的使用开始吧 想想看,我们平时是如何使用vue的data部分的? 无非是这两种情况 (你 ...

  8. 解决Eclipse中启动Tomcat报unable to start within 45 seconds问题

    启动项目的时候报Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server ...

  9. 初露头角!Walrus入选服贸会“数智影响力”数字化转型创新案例

    9月5日,由北京市通信管理局.工业和信息化部新闻宣传中心联合主办的"企业数字化转型论坛"在2023中国国际服务贸易交易会期间召开,论坛以"数字化引领 高质量发展" ...

  10. AK、SK实现(双方API交互:签名及验证)

    参考:https://blog.csdn.net/yqwang75457/article/details/117815474 1.原理 AK/SK: AK:Access Key Id,用于标示用户. ...