数据结构题做题笔记

· · 个人记录

Limit 是可爱的小姐姐/qq

为了练习数据结构于是就来写一下

P3372 【模板】线段树 1

这题随便写,就不咋说了。

P3373 【模板】线段树 2

还是随便写,只不过要注意的是乘法的标记下传的时候顺便要影响加法标记。

P6492 [COCI2010-2011#6] STEP

考虑将 L 记作 1R 记作 0,再构造序列 b_i=a_i\operatorname{and}\ (l_i\operatorname{and}1),那么 a 中一段交错子序列对应着 b 中一段 0 或是一段 1,那么只要维护一下这个东西的长度就好了。

这个的话就是跟 GSS 那个东西一样的,唯一有个不同的点(以维护最长的 0 前缀为例)就是如果只有左子区间全为 0 的时候才能让右子区间带来贡献。

P2023 [AHOI2009] 维护序列

板子题。

P1637 三元上升子序列

很明显 DP 一下,设 f_{i,j} 表示长度为 j 的子序列末尾在第 i 个的方案数,可以写出转移:

f_{i,j}=\sum\limits_{k<i,a_k<a_i}f_{k,j-1}

考虑从左往右枚举来解决 k<i 的问题,对于 a_k<a_i 可以离散化之后开权值线段树维护这些 f 即可。

CF915E Physical Education Lessons

因为出题人比较良心,所以这题变成了珂朵莉树模板题,没什么好说的。

P3384 【模板】轻重链剖分

板子题。

P5490 【模板】扫描线

咕咕咕。

P3369 【模板】普通平衡树

板子题。

P3833 [SHOI2012]魔法树

链加子树和,树剖板子题。

P2184 贪婪大陆

注意到对于某个询问 [l,r] 来说,如果区间 [l_i,r_i] 满足 l_i\leq r 那么这个区间还是有可能被计入贡献的,如果区间 [l_i,r_i] 满足 r_i<l 那么是不可能计入贡献的。

所以开两个树状数组维护一下满足 l_i\leq x 的区间个数和 r_i\leq x 的区间个数,然后直接减一下就好了。

注意这里是不会多减的,因为如果 r_i<l 的话那么 l_i\leq r 一定成立,就会在第一步加上去然后第二步减掉。

P3178 [HAOI2015]树上操作

板子题。

P2894 [USACO08FEB]Hotel G

咕咕咕。

P4145 上帝造题的七分钟2 / 花神游历各国

维护一下区间最大值,如果区间最大值为 0 或者 1 的话就不用修改这段区间,否则暴力递归。

因为一个数 nO(\log\log n) 次平方就可以变成 1,所以时间复杂度可以保证。

P1438 无聊的数列

咕咕咕。

P4114 Qtree1

记录一下第 x 条边是什么就是个板子题了。

P4588 [TJOI2018]数学计算

不能直接做除法操作,因为模合数下有的数可能没有乘法逆元,那么考虑先把所有操作扔上来,然后撤销操作直接撤销,询问就是查询前缀积。

SP1716 GSS3 - Can you answer these queries III

老套路了,随便维护一下得了。

P2146 [NOI2015]软件包管理器

树剖板子题怎么这么多啊 >_<

P1471 方差

随便推一下式子:

ns^2=\sum\limits_{i=1}^{n}\left(\overline{x}-x_i\right)^2=n\overline{x}^2-2\overline{x}\sum\limits_{i=1}^{n}x_i^2+\sum\limits_{i=1}^{n}x_i^2

随便化一下

s^2=\frac{\sum\limits_{i=1}^{n}x_i^2}{n}-n\overline{x}^2

很明显要维护和和平方和,平方和的话懒标记的打法还是要推柿子:

\sum\limits_{i=1}^{n}\left(x_i+k\right)^2=\sum\limits_{i=1}^{n}x_i^2+2k\sum\limits_{i=1}^{n}x_i+nk^2

于是没了。

SP2713 GSS4 - Can you answer these queries IV

跟花神那题一样的。

CF343D Water Tree

树剖板子题。

P6327 区间加区间sin和

维护一下 \cos(a_i) 的和和 \sin(a_i) 的和,然后使用三角恒等变换:

\sum\limits_{i=1}^{n}\sin(a_i+t)=\cos t\sum\limits_{i=1}^{n}\sin a_i+\sin t\sum\limits_{i=1}^{n}\cos a_i \sum\limits_{i=1}^{n}\cos(a_i+t)=\cos t\sum\limits_{i=1}^{n}\cos a_i-\sin t\sum\limits_{i=1}^{n}\sin a_i

这么样打懒标记就没了。

P1438 无聊的数列

这种 sb 题调了我好久,我真丢人。

考虑用两个懒标记记录首项和公差,然后利用等差数列求和公式:

\sum\limits_{i=1}^{n}a_i+k+(i-1)d=nk+\frac{n(n-1)}{2}d+\sum\limits_{i=1}^{n}a_i

然后没了。

P5142 区间方差

跟前面那个叫方差的题一个思路,但是没有浮点数的处理细节比较少。

SP1043 GSS1 - Can you answer these queries I

裸题。