CDQZ DS 题单总结(上)
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}\)):
对于一个区间,我们维护两个值,分别是两两相乘的值和区间和,对于区间的合并,我们则有:
\]
然后就做完了,毕竟是单点改,所以修改操作也是 \(O(M \log n)\) 的。
以上两种的时间复杂度都是 \(O(n \log n)\)
Challenge 5:
也是线段树板子题,不过 \(\text{lazytag}\) 下传的时候要考虑一下 \(\text{lazytag}\) 是否真的存在。
或许珂朵莉树也是个不错的选择?
Challenge 6:
(前言:楼房重建的翻版)
喵喵题,所有的喵喵之处全在 \(\text{pushup}\) 上了,其余的和板子一样。
对于本题,\(\text{pushup}\) 应该依照一下逻辑:
- 若当前区间的最大值小于 \(cmax\),则直接返回 \(0\)
- 若当前区间为叶子,则返回 \(cmax < seg[p].max\)
- 若当前区间的第一个元素大于 \(cmax\),则直接返回该区间的贡献。
- 若当前区间的左儿子的最大值小于等于 \(cmax\),则递归到右儿子
- (重点)若当前区间的左儿子最大值大于 \(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}\)),用来记录有哪些差值需要被删除多少次。
注意:
- 当我们删除一个值的时候,应当将他的前驱和后继的差再 \(\text{push}\) 进去,否则会少信息。
- 当我们插入一个值得时候,应当先找前驱后继再插入,否则会增加代码量或者有一定概率 G 掉
时间复杂度应该是个摊还分析,不会,盲猜 \(O(n \log n)\)
关于删除操作还有另外两种思路(全部来自于 \(\text{do\_while\_true}\),在这里万分感谢他):
- 使用 \(\text{multi\_set}\),作用和优先队列差不多(抛开对比优先队列的常数),但是支持迭代器 \(\text{erase}\),删除的时候直接 \(\text{lower\_bound} + \text{erase}\),查询最小只需要 \(\text{begin}\) 就行了。时间复杂度依旧是 \(O(M \log n)\)
- 可删堆的思路,似乎常数更小?
均摊下来依旧是 \(O(M\log n)\)
Challenge 9:
一道非常经典的 trick 好题
我们将每个线段树节点维护两个信息,分别是当前位置的数字和当前区间的有效元素个数,此时删除操作就变成了减少某个位置的有效元素个数,查询操作就变成了用当前的有效元素个数信息来凑出第 \(k\) 个数。
Challenge 10:
值域线段树或平衡树,原理同 Challenge 9。
注意查询右子树的时候应该是 \(k - \text{左子树的cnt}\)
Challenge 11:
主席树板子(雾),没啥技术含量(大雾),只要对线段树足够了解可以直接现魔改。
Challenge 12:
主席树板子二……
拓展:如果带单点修改怎么办
即答:主席树套树状数组
CDQZ DS 题单总结(上)的更多相关文章
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...
- LCT总结——应用篇(附题单)(LCT)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--概念篇戳这里 题单 灰常感谢XZY巨佬提供的强力资磁!(可参考XZY巨佬的博客总结) 题单对于系 ...
- AC自动机题单
AC自动机题目 真的超级感谢xzy 真的帮到我很多 题单 [X] [luogu3808][模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P38 ...
- LCT题单(自己的做题情况反馈)(转自Flash)
LCT题单(自己的做题情况反馈)(转自Flash) 随时进Flash Hu的LCT看一发 也可以看一下我自己的风格的板子 开始 维护链信息(LCT上的平衡树操作) [X] 洛谷P3690 [模板]Li ...
- tp5 ajax单文件上传
HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(56)-插件---单文件上传与easyui使用fancybox
系列目录 https://yunpan.cn/cZVeSJ33XSHKZ 访问密码 0fc2 今天整合lightbox插件Fancybox1.3.4,发现1.3.4版本太老了.而目前easyui 1 ...
- asp.net.mvc 的单文件上传和多文件上传的简单例子
首先打开vs2012,创建空的mvc4项目,名称为MVCStudy,选择基本模板
- php文件上传之单文件上传
为了简单一些,php文件跟form表单写在了一个文件里. php单文件上传----> <!DOCTYPE html> <html> <head> <me ...
- Struts2实现单文件上传
首先配置一下web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi ...
随机推荐
- shell 并发
#!/bin/bash # 设置并发数 thread_num=3 # 创建管道文件 FIFO=/tmp/$$-FIFO mkfifo $FIFO # 使用句柄打开管道文件 exec 1000<& ...
- Linux shell:根据盘符定位硬盘在服务器上的位置
disk-light.sh #!/bin/bash t_dev=$1 [ -b "$t_dev" ] || { echo "-b failed: $t_dev" ...
- git报错:error: Your local changes to the following files would be overwritten by checkout:
原因 原本想切换到dev分支,拉取远程dev分支,但我将分支上的数据修改了,此时切换分支报错 解决方案 方法一: 存到暂存区 # 暂存 git add . git stash 之后切换分支到dev,执 ...
- vs(visual stuiod)中vc++工程的Filter和Folder及vcxproj知识
vs中创建Filter 在一个新项目中右键 - Add - New,默认只有一选项 New Filter. 创建出来的Filter可以理解为是VS的过滤器(虚拟目录),它不会在本地的磁盘上新建目录,而 ...
- [golang]使用gopsutil获取系统信息
前言 在python中有个psutil库用于获取系统信息,而go语言也有一个类似的库--gopsutil,功能差不多. 项目地址:https://github.com/shirou/gopsutil ...
- 【io_uring】liburing 用户库源码分析
文章目录 整体流程 `io_uring_queue_init` `io_uring_get_sqe` `io_uring_prep_#OP` `io_uring_sqe_set_data` `io_u ...
- 快手商品详情API接口如何使用
使用快手开的API接口获取商品详情,可按照以下步骤进行: 1.注册账号并创建应用 注册开发者账号,并在账号后台中创建一个应用,获得AppKey和AppSecret等信息.这些信息是使用API接口访问快 ...
- Github工具库
0x01 漏洞练习平台 WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.c ...
- Row Major
Smiling & Weeping ----昨天, 别人在我身旁大声说出你的名字, 这对于我, 像从敞开的窗口扔进了一朵玫瑰花. 思路:不客气地说,这是一道令人费解的题目,要求构造一个字符串, ...
- Solution -「CF 888E」Maximum Subsequence
Description Link. 给一个数列和 \(m\),在数列任选若干个数,使得他们的和对 \(m\) 取模后最大. Solution 记录一下犯下的一个 nt 错误. 首先我们有一个显然的 D ...