做题小记
221103
平衡树练习(结果并不是都必须用平衡树)。
-
注意这道题里面生成数据的种子是
unsigend int
类型,所以一定小心#define int long long
会影响这个种子自然溢出,导致WA
掉。 -
第一眼以为要写平衡树维护插入操作,结果发现只需要用
vector
维护就行了,平衡树的题不用写平衡树可还行,前两个操作用vector
和对顶堆就行,第三个用multiset
维护一下就行。 -
用一个小根堆和一个大根堆分别维护排序后序列的后半截和前半截,加入新数的时候先加入表示后半截的小根堆,然后平衡两个堆的
size
至相差 \(1\),中位数就是堆顶元素。 -
k=1
就直接算中位数,k=2
可以将原来的路径分成左右两半然后分别对左右求中位数。 -
题解里面写的是
modify(int y, int x)
然后用modify(read() - last, read() - last)
调用,编译器特性先右再左,所以如果读入好了再来调用就不应该把x,y
颠倒。调了半天
Splay
结果错的不是Splay
……
221104
平衡树,左偏树,后缀自动机。
-
类似于 [SCOI2014 方伯伯的 OJ],将没被更改的区间缩成一个点,对受影响的行和列维护 Splay 即可。
-
左偏树模板题,用并查集维护当前堆顶。
-
左偏树模板题,并查集记录属于哪一个堆,用一个数组
root
记录这个堆的堆顶,方便进行弹出操作。 -
类似树形 \(\texttt{DP}\)。对每个结点维护一个大根堆,存储当前子树内选择的节点,如果总和大于 \(m\) 就一直弹出直到符合为止。子树到当前节点的堆的合并用左偏树实现即可。
-
考虑从下到上合并每个骑士,到达每个节点的时候将不合题意的骑士踢出堆并计算答案,用左偏树维护这一过程。
-
注意
cerr
虽然不会影响答案的正确性,但是会对程序效率产生极大的影响。此题没删cerr
结果 T 9 个点,删掉就 AC 了,并且跑得很快。 -
后缀自动机板题,建出后缀自动机后直接在上面记搜统计答案。
-
后缀自动机的一个经典应用,建出后缀自动机过后统计路径数量,然后再自动机上直接找到对应字串。
-
这题怎么评上蓝的?
直接区间 \(\texttt{DP}\),写个记搜就可以了。开个
__int128
就不需要写高精度了。
221107
改题,图论。
-
每对点双之间直接连成完全图即可。
-
P1522 [USACO2.4] 牛的旅行 Cow Tours
数据范围很小,直接考虑跑 floyed,然后处理方式很类似 CSP-S 2022 的 T1,枚举中间两点,预处理对于这两点来说最远的点,然后拼接起来求直径。可能出现联通后的直径并不经过连的边,所以用并查集维护一下原来每个联通块的直径即可。
-
因为有速度限制,考虑分层图。此处的分层图不一定要建出来,可以直接用二维
dist[][]
记录,把 SPFA 也给改成二维跑就行了。在跑 SPFA 的时候顺便记录下每个状态的来源,方便输出方案。 -
P4001 [ICPC-Beijing 2006] 狼抓兔子
两种做法。第一种是直接建图跑最小割,因为 dinic 的玄学优化所以跑的挺快。第二种是对于平面图建立对偶图跑最短路。对偶图是一种将连通性信息转换为一张图表示的图。这道题可以说是对偶图的模板题了。
-
结论题,取三个 LCA 中深度最深的一个即可。证明考虑将这个点移至相邻的点不会使答案更优即可。
221109
学习,练习 KDT。
-
KDT 板题,估价函数设计为到当前矩形的最远距离,用堆维护前 \(k\) 大即可。
-
空间 20 MB,只能写 KDT。KDT 的插入可能破坏平衡性,并且 KDT 是不能进行旋转的,所以可以用类似替罪羊树的思路,设置一个常数 \(\alpha\),一旦某个子树大小超过了整个子树的 \(\alpha\),则认为这个子树失衡,进行重构。替罪羊树的 \(\alpha\) 一般取 \(0.7\),而 KDT 一般取 \(0.6\)。
-
枚举每个点,查询对于每个点的最远点和最近点求差即可。查询最远和最近可以直接用 KDT 写,一般来说很难卡。
-
人傻常数大,跟着题解把 \(\alpha\) 改成了 \(0.7\),发现插入部分写错了,改完过后还是 T,忘了把 \(\alpha\) 改回来试试。调一下午结果把 \(\alpha\) 改成 \(0.6\) 就过了。有点生气。
没卡 KDT,直接用 KDT 在线查询最近点即可,随机数据期望上是 \(\mathcal O(n\sqrt n)\) 的。插入操作类似替罪羊的操作即可。
-
同 [K 远点对],用堆维护前 \(k\) 大。
-
同 [简单题],双倍经验。
221111
斜率优化 DP。
-
暴力 \(\texttt{DP}\) 方程好推,但是化成斜率式过后发现 \(k,x\) 均不满足单调性,因此用 CDQ 处理单调性的问题。
先将序列按照 \(k\) 排序,然后 CDQ,归并的时候用 \(x\) 进行归并排序。
221114
-
记录 \(pre\) 为当前数字上一个出现的位置,查询数字个数就变成了查询有多少 \(pre\) 是小于 \(l\) 的。直接用主席树即可。
-
P3605 [USACO17JAN]Promotion Counting P
先跑 DFS 序,然后答案就是 DFS 序上对应的区间上大于某数的个数,主席树维护即可。
-
对每一个 \(c\) 都建立一棵线段树,树剖 + 线段树维护区间和与最值。注意到空间限制,使用动态开点线段树。
221116
-
树形 \(\texttt{DP}\) + 树上背包。最好用填表法写,不然复杂度很容易假掉。将点对的贡献转换为边的贡献,采用类似费用提前计算的思路计算每一条边的贡献。
-
树上背包,用四维 \(\texttt{DP}\) 即可。注意使用填表法,并注意上下界问题,防止时间复杂度假掉。
-
推出 \(\texttt{DP}\) 式子,发现具有类似二维前缀和的形式,用二维树状数组优化即可。
-
虽然是虚树模板题,但是代码难度绝对不亚于一道黑题,用面向对象的方式写了 6.7K,荣获我写过的最长的代码的殊荣(
建立出虚树,按照每个点的位置分情况讨论。用 4 个 DFS 解决。
221118
随机化乱搞。
-
直接
shffle
排列 \(\mathcal O(n)\) 统计即可。 -
一种贪心的想法就是将数字按顺序加入目前和最小的组内,但是会发现数字的顺序不好确定,所以可以用随机化确定顺序,配合卡时就可以 A 掉,出错概率很小。
-
模拟退火,随机交换两个组别里的数即可。注意接受劣解的概率的函数别写错了。
221202
多项式。
-
拉插模板,构造出拉插的基本多项式直接硬代即可。
-
用 \(p\) 阶差分证明答案是一个 \(k+1\) 次的多项式,然后取连续的 \(k+2\) 个点用拉插 \(\mathcal O(k)\) 求解。总时间复杂度带上求逆元的 \(\log\)。
221204
FFT。
-
FFT 模板。
-
将大数转换成为多项式然后用 FFT 乘起来就行了。注意处理进位问题。
230112
字符串。
-
正常 KMP 处理出最长 border,然后再维护一个指针 \(k\) 来表示长度 \(\le \lfloor\dfrac i 2\rfloor\) 的 border 的位置,维护方法就是本来的 KMP 的指针跳法上增加一个长度超过 \(\lfloor\dfrac i 2\rfloor\) 的时候往前跳。然后就可以 \(\mathcal O(n)\) 地做完这道题了。
-
建出 AC 机,然后在 Fail 树上统计子树大小即可。