搬运自洛谷博客,原发表时间:2022-12-06
网课人在家摆烂太悲伤了,于是做一些数据结构题。
本博客和ds学习笔记的区别:后者收录小清新/有趣题。
目前拥有的讲义:
感觉数据结构题评紫的巨大多,良莠不齐。
可能会有非常简单的题加入这里,勿喷。
完成度指数:0%表示一半以上核心代码照着题解完成;100%表示完全独立完成。
P8511 [Ynoi Easy Round 2021] TEST_68
tag:树上问题
题意:一棵树,对于每个节点求其子树以外的任何两节点的最大异或和。
首先考虑整棵树,求出其最大异或和 \(bst\),及得到该数的两点 \(x,y\)。
显然非 \(x\) 或 \(y\) 的祖先的所有节点的答案即为 \(bst\)。
考虑 \(x\) 或 \(y\) 的祖先:自顶向下,每次就增加了一定的点,分别对两条路径求最大异或和。
总时间复杂度 \(O(n \log a)\),\(a\) 为值域。
完成度:60%
P4396 [AHOI2013]作业
tag:莫队&分块
明显的莫队,使用树状数组 \(O(\log n)-O(\log n)\) 维护,时间复杂度 \(O(n \sqrt{m} \log n)\),很笨。
注意到修改/查询的次数为 \(O(n \sqrt m)-O(m)\),可以采用 \(O(1)-O(\sqrt n)\) 的数据结构维护。
值域分块满足上述要求。
时间复杂度 \(O(n \sqrt{m}+m \sqrt{a})\),\(a\) 为值域。
完成度:100%
P5356 [Ynoi2017] 由乃打扑克
tag:分块
题意:区间加,区间第 \(k\) 小。
分块,块内排序。(排序后的数组最好附带一个原数组的编号)
(以下 \(L\) 表示块长)
- 区间加
整块打 \(\text{tag}\),散块中挑出区间内的数(有序),修改后和剩下的数归并排序得到整块的有序数组。
时间复杂度为 \(O(L+\dfrac{n}{L})\)。
- 区间第 \(k\) 小
散块通过归并排序为一组,一整块单独为一组。值域中二分答案,在每组中求出大于其的个数,判断加起来后是否达到 \(k\) 即可。
时间复杂度 \(O(\Delta\dfrac{n}{L} \log L)\),\(\Delta\) 表示二分次数。
理论上取 \(L=O(\sqrt{n} \log n)\) 较优。
卡常技巧:根据块内最值求出二分上下界,能带来较大常数优化。
写得非常丑陋的code
想+写+调了总计2.5h,吐了。
完成度:80%
P3863 序列
tag:扫描线&分块
题意:区间加,查询某个位置在过去的多少时间内不小于某个值。
离线扫描线扫序列维,数据结构维护时间维。
将区间加拆为在 \(l\) 处加上 \(v\),在 \(r+1\) 处减去 \(v\),拆完后的修改对 \([t,m]\) 有贡献,问询即为新序列中 \([0,t-1]\) 内 \(\ge y-a_p\) 的数量。(\(t\) 为时间戳)
于是转化为区间加区间rank,使用分块可以在 \(O(n \sqrt{n \log n})\) 内解决,可以通过。
(或者分块套值域分块,\(O(n \sqrt n)\),作者懒得写了)
完成度:60%
P4887 【模板】莫队二次离线(第十四分块(前体))
tag:莫队
题意:求区间内异或起来有 \(k\) 个二进制位的二元组个数。
莫二离的本质:\(O(n \sqrt{m} \Delta) \rightarrow O(n \sqrt{m}+n \Delta)\),\(\Delta\) 为单次挪动指针的复杂度。
适用范围:\(\Delta > O(1)\),一个数的对区间的贡献与区间中的数有关,贡献可差分。
设 \(f(x,l,r)\) 为 \(a_x\) 对区间 \([l,r]\) 的贡献,\(F(x,l)=f(x,1,l)\)。(区间转化为前缀差分)
在右指针移动到 \(x\) 时,会产生的答案变动为 \(f(x,l,x-1)=F(x,x-1)-F(x,l-1)\);
在左指针移动到 \(x\) 时,会产生的答案变动为 \(f(x,x+1,r)=F(x,r)-F(x,x)\)。
\(F(x,x-1),F(x,x)\) 可预处理;由于莫队指针移动的连续性,可以将连续的 \(-F(x,l-1)\) 和 \(F(x,r)\) 记录在区间中,二次计算。(也就是二次离线)
而指针的移动对后续询问都有贡献,因此求前缀和后才是真正的答案。
完成度:0%
P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II
tag:莫队&分块
题意:区间逆序对数。
莫二离,使用值域分块维护二次计算。(与上题类似,略过)
调一下块长就能过。
完成度:60%
P3245 [HNOI2016]大数
tag:莫队
题意:一个数字串,求区间中可被 \(p\) 整除的子串的个数。
明显可以转化为后缀串做差,离散化后就变成了小Z的袜子。特判一下2和5即可。
完成度:80%