做题小记

221103

平衡树练习(结果并不是都必须用平衡树)。

  • P5338 [TJOI2019]甲苯先生的滚榜

    注意这道题里面生成数据的种子是 unsigend int 类型,所以一定小心 #define int long long 会影响这个种子自然溢出,导致 WA 掉。

  • P1110 [ZJOI2007] 报表统计

    第一眼以为要写平衡树维护插入操作,结果发现只需要用 vector 维护就行了,平衡树的题不用写平衡树可还行,前两个操作用 vector 和对顶堆就行,第三个用 multiset 维护一下就行。

  • P1168 中位数

    用一个小根堆和一个大根堆分别维护排序后序列的后半截和前半截,加入新数的时候先加入表示后半截的小根堆,然后平衡两个堆的 size 至相差 \(1\),中位数就是堆顶元素。

  • P3644 [APIO2015] 八邻旁之桥

    k=1 就直接算中位数,k=2 可以将原来的路径分成左右两半然后分别对左右求中位数。

  • P3285 [SCOI2014]方伯伯的OJ

    题解里面写的是 modify(int y, int x) 然后用 modify(read() - last, read() - last) 调用,编译器特性先右再左,所以如果读入好了再来调用就不应该把 x,y 颠倒。

    调了半天 Splay 结果错的不是 Splay……

221104

平衡树,左偏树,后缀自动机。

  • P3960 [NOIP2017 提高组] 列队

    类似于 [SCOI2014 方伯伯的 OJ],将没被更改的区间缩成一个点,对受影响的行和列维护 Splay 即可。

  • P1456 Monkey King

    左偏树模板题,用并查集维护当前堆顶。

  • P2713 罗马游戏

    左偏树模板题,并查集记录属于哪一个堆,用一个数组 root 记录这个堆的堆顶,方便进行弹出操作。

  • P1552 [APIO2012] 派遣

    类似树形 \(\texttt{DP}\)。对每个结点维护一个大根堆,存储当前子树内选择的节点,如果总和大于 \(m\) 就一直弹出直到符合为止。子树到当前节点的堆的合并用左偏树实现即可。

  • P3261 [JLOI2015]城池攻占

    考虑从下到上合并每个骑士,到达每个节点的时候将不合题意的骑士踢出堆并计算答案,用左偏树维护这一过程。

  • P3804 【模板】后缀自动机 (SAM)

    学习。

    注意 cerr 虽然不会影响答案的正确性,但是会对程序效率产生极大的影响。此题没删 cerr 结果 T 9 个点,删掉就 AC 了,并且跑得很快。

  • P2408 不同子串个数

    后缀自动机板题,建出后缀自动机后直接在上面记搜统计答案。

  • P3975 [TJOI2015]弦论

    后缀自动机的一个经典应用,建出后缀自动机过后统计路径数量,然后再自动机上直接找到对应字串。

  • P1005 [NOIP2007 提高组] 矩阵取数游戏

    这题怎么评上蓝的?

    直接区间 \(\texttt{DP}\),写个记搜就可以了。开个 __int128 就不需要写高精度了。

221107

改题,图论。

  • #C221106A. 画图

    每对点双之间直接连成完全图即可。

  • P1522 [USACO2.4] 牛的旅行 Cow Tours

    数据范围很小,直接考虑跑 floyed,然后处理方式很类似 CSP-S 2022 的 T1,枚举中间两点,预处理对于这两点来说最远的点,然后拼接起来求直径。可能出现联通后的直径并不经过连的边,所以用并查集维护一下原来每个联通块的直径即可。

  • P1266 速度限制

    因为有速度限制,考虑分层图。此处的分层图不一定要建出来,可以直接用二维 dist[][] 记录,把 SPFA 也给改成二维跑就行了。在跑 SPFA 的时候顺便记录下每个状态的来源,方便输出方案。

  • P4001 [ICPC-Beijing 2006] 狼抓兔子

    两种做法。第一种是直接建图跑最小割,因为 dinic 的玄学优化所以跑的挺快。第二种是对于平面图建立对偶图跑最短路。对偶图是一种将连通性信息转换为一张图表示的图。这道题可以说是对偶图的模板题了。

  • P4281 [AHOI2008]紧急集合 / 聚会

    结论题,取三个 LCA 中深度最深的一个即可。证明考虑将这个点移至相邻的点不会使答案更优即可。

221109

学习,练习 KDT。

  • P4357 [CQOI2016]K 远点对

    KDT 板题,估价函数设计为到当前矩形的最远距离,用堆维护前 \(k\) 大即可。

  • P4148 简单题

    空间 20 MB,只能写 KDT。KDT 的插入可能破坏平衡性,并且 KDT 是不能进行旋转的,所以可以用类似替罪羊树的思路,设置一个常数 \(\alpha\),一旦某个子树大小超过了整个子树的 \(\alpha\),则认为这个子树失衡,进行重构。替罪羊树的 \(\alpha\) 一般取 \(0.7\),而 KDT 一般取 \(0.6\)

  • P2479 [SDOI2010]捉迷藏

    枚举每个点,查询对于每个点的最远点和最近点求差即可。查询最远和最近可以直接用 KDT 写,一般来说很难卡。

  • P4169 [Violet]天使玩偶/SJY摆棋子

    人傻常数大,跟着题解把 \(\alpha\) 改成了 \(0.7\),发现插入部分写错了,改完过后还是 T,忘了把 \(\alpha\) 改回来试试。调一下午结果把 \(\alpha\) 改成 \(0.6\) 就过了。有点生气。

    没卡 KDT,直接用 KDT 在线查询最近点即可,随机数据期望上是 \(\mathcal O(n\sqrt n)\) 的。插入操作类似替罪羊的操作即可。

  • P2093 [国家集训队]JZPFAR

    同 [K 远点对],用堆维护前 \(k\) 大。

  • P4390 [BOI2007]Mokia 摩基亚

    同 [简单题],双倍经验。

221111

斜率优化 DP。

  • P4027 [NOI2007] 货币兑换

    暴力 \(\texttt{DP}\) 方程好推,但是化成斜率式过后发现 \(k,x\) 均不满足单调性,因此用 CDQ 处理单调性的问题。

    先将序列按照 \(k\) 排序,然后 CDQ,归并的时候用 \(x\) 进行归并排序。

221114

  • P1972 [SDOI2009] HH的项链

    记录 \(pre\) 为当前数字上一个出现的位置,查询数字个数就变成了查询有多少 \(pre\) 是小于 \(l\) 的。直接用主席树即可。

  • P3605 [USACO17JAN]Promotion Counting P

    先跑 DFS 序,然后答案就是 DFS 序上对应的区间上大于某数的个数,主席树维护即可。

  • P3313 [SDOI2014]旅行

    对每一个 \(c\) 都建立一棵线段树,树剖 + 线段树维护区间和与最值。注意到空间限制,使用动态开点线段树。

221116

  • P3177 [HAOI2015] 树上染色

    树形 \(\texttt{DP}\) + 树上背包。最好用填表法写,不然复杂度很容易假掉。将点对的贡献转换为边的贡献,采用类似费用提前计算的思路计算每一条边的贡献。

  • P4516 [JSOI2018] 潜入行动

    树上背包,用四维 \(\texttt{DP}\) 即可。注意使用填表法,并注意上下界问题,防止时间复杂度假掉。

  • P3287 [SCOI2014]方伯伯的玉米田

    推出 \(\texttt{DP}\) 式子,发现具有类似二维前缀和的形式,用二维树状数组优化即可。

  • P3233 [HNOI2014]世界树

    虽然是虚树模板题,但是代码难度绝对不亚于一道黑题,用面向对象的方式写了 6.7K,荣获我写过的最长的代码的殊荣(

    建立出虚树,按照每个点的位置分情况讨论。用 4 个 DFS 解决。

221118

随机化乱搞。

  • P2210 Haywire

    直接 shffle 排列 \(\mathcal O(n)\) 统计即可。

  • P2503 [HAOI2006]均分数据

    一种贪心的想法就是将数字按顺序加入目前和最小的组内,但是会发现数字的顺序不好确定,所以可以用随机化确定顺序,配合卡时就可以 A 掉,出错概率很小。

  • P3878 [TJOI2010]分金币

    模拟退火,随机交换两个组别里的数即可。注意接受劣解的概率的函数别写错了。

221202

多项式。

  • P4781 【模板】拉格朗日插值

    拉插模板,构造出拉插的基本多项式直接硬代即可。

  • The Sum of the k-th Powers

    \(p\) 阶差分证明答案是一个 \(k+1\) 次的多项式,然后取连续的 \(k+2\) 个点用拉插 \(\mathcal O(k)\) 求解。总时间复杂度带上求逆元的 \(\log\)

221204

FFT。

230112

字符串。

  • P2375 [NOI2014] 动物园

    正常 KMP 处理出最长 border,然后再维护一个指针 \(k\) 来表示长度 \(\le \lfloor\dfrac i 2\rfloor\) 的 border 的位置,维护方法就是本来的 KMP 的指针跳法上增加一个长度超过 \(\lfloor\dfrac i 2\rfloor\) 的时候往前跳。然后就可以 \(\mathcal O(n)\) 地做完这道题了。

  • P3966 [TJOI2013]单词

    建出 AC 机,然后在 Fail 树上统计子树大小即可。

posted @ 2022-11-03 16:18  Hanx16Msgr  阅读(26)  评论(0编辑  收藏  举报