做题记录

徒留浅痕,为证永存。

突然想起来有个东西叫做 做题记录
完了,啥也没写(虽然第一次知道这玩意已经是快要高二了,根本来不及写)。现在开始写应该不晚吧?
总之在退役之前才开始写做题记录。应该没有人像我一样抽象。

2024.11.14

UVA12983 The Battle of Chibi

rz 题,我也不知道为什么我要写。随便搓个 $3$ 维 dp 然后 BIT 优化一下就过了。

P2375 [NOI2014] 动物园

重温经典。想了一下当时的作法并且重新打了一遍。至少对于字符串有点手感了。

P9026 [CCC2021 S4] Daily Commute

ez,bfs 求距离然后拿 set 或者优先队列(延迟删除)记录答案。唯一比较唐的地方是单向边建成双向边导致样例没过(雾。

2024.11.15

生病请假。

2024.11.18

回归。

P9326 [CCC 2023 S3] Palindromic Poster

非常有意思的构造题。分讨一下即可。

P9606 [CERC2019] ABB

kmp(复制一遍、翻转并扔到最前面直接 kmp) / manarcher(直接做) 解决。神秘串串题。

P8085 [COCI2011-2012#4] KRIPTOGRAM

有一个非常有意思的 trick 转换。直接把相邻字符之间的距离拿来当串跑 kmp,比较有意思。

2024.11.19

P11069 「QMSOI R1」 生熏鱼

rz 背包题。不知道为什么卡了那么久。

P10449 费解的开关

bfs 爆搜。md 本来只用全局做一次的,我非得 T 组数据跑 T 次,结果自然是 T 飞。不知道为什么卡了这么久。

P11012 「ALFR Round 4」B 颜料

有意思的双指针。感觉 $O(n)$ 的写法有点奇妙,值得消化理解。

2024.11.20

P10403 「XSOI-R1」跳跃游戏

st 表维护区间 gcd,然后套个双指针即可。
发现题解区全是神秘二分,顺便写了篇 题解

P9402 [POI 2020/2021 R3] Droga do domu

一个神秘的分层图。把路线当作链单独建点处理,然后直接 dp 即可(因为是链)。细节比较复杂,最好还是看代码多理解一下。

2024.11.24

P9374 「DROI」Round 2 单图

搞清楚符合题意的两种情况后,直接组合数计算即可,没有任何优化。

P9235 [蓝桥杯 2023 省 A] 网络稳定性

建完 kruskal 直接跑树上 lca 即可。怎么这么板?还是个蓝的。

P11323 【MX-S7-T1】「SMOI-R2」Happy Card

分讨,将 4 的情况拆成 3+1,然后尽量多 3 带,贪心 + 分讨。

2024.11.25

P11324 【MX-S7-T2】「SMOI-R2」Speaker

有点意思。
首先首尾的利润和路上必经边的路费和可前缀和计算,实际上要求的是 $z$ 的利润减去 $2$ 倍的 $z$ 到 $x$ 至 $y$ 这条路径的路费(来回,所以两倍),这部分考虑特殊处理。
对于每个点 $u$ 求出最大的 $dp_u = c_v-2\times disw(u\ to\ v)$,换根可求出。那么路径 $x$ 到 $y$ 的答案即该路径上所有 $dp_u$ 的最大值。(实际上最优方案一定在其中,且最优方案的为最优点 $z$ 到路径上距离最短的点的 $dp$ 值)。这里可以思考一下为什么,这个 trick 有点妙,有点常见。
然后换根和倍增处理完所有就可以做完了。

2024.11.26

多少还是得写点题。

P4116 Qtree3

树剖,然后拿 set 维护重链,查询时跳链即可。

P5838 [USACO19DEC] Milk Visits G

可以树剖和 set 维护,也可以树剖和主席树,但我选择暴力建 $n$ 棵树然后动态开点。
(听说还有 $O(n+m)$ 的神秘线性做法?我 ds 学傻了)

P5836 [USACO19DEC] Milk Visits S

上面那玩意的弱化版,Ctrl C+V 过了。

P3313 [SDOI2014] 旅行

树剖 and 动态开点。不知道为什么是个紫的。

其他

乱打了一些板子,就当是康复训练了。

2024.11.27

实际上今天没有写题,但是考试考了 $330pts$,奖励自己一天。

2024.11.28

P4551 最长异或路径

水题。树上差分 and Trie 树秒了。

2024.12.9

中途一直学 whk,现在回来补 OI。

P1533 可怜的狗狗

整体二分板子。打了一下发现不难理解。

P3527 [POI2011] MET-Meteors

整体二分典中典。二分时间可得。比较恶心的是这个阴间题目有几个数据点会爆 long long,有人说边加边特判,我听不懂直接 __int128。
10 min 后打脸了。luogu 上时限给的 2s,所以过了。ybtoj 上给的 1 s,所以被卡常了。被迫用 long long 写了个特判才过。

P3242 [HNOI2015] 接水果

写了将近半天(中午耽误太久了)。
首先考虑将路径的包含问题转化为 dfn 序的大小问题(即每个点记录 $L_u$ 和 $R_u$ 表示子树内 dfn 序的区间),然后根据路径一个端点是否是另一个端点的祖先分讨,可以得到两个偏序关系,即二维平面上的一个矩阵。
可以使用树套树,但是直接扫描线会更好。套个整体二分解决事情。
调了这么久主要是注意二维区间的两个维度不能轻易交换,发现矩阵的两个维度的区间不相交,故钦定 dfn 序小的为第一维(大的同理),然后做扫描线。
代码不长,注意一些细节:空间和离散化问题。

P3332 [ZJOI2013] K大数查询

比较板的题。整体二分随便艹一下就能过。由于不会区间加的树状数组,所以被迫写线段树。
调了 30min 的整体二分发现是线段树写锅了(雾。

P1527 [国家集训队] 矩阵乘法

整体二分板子。但是套二维树状数组。

2024.12.10

上午的考试

烤焦了。

Test 12.10 T1

简述一下:一张 $n$ 点 $m$ 边的图,每个点有点权 $P_u$,初始占领 $s$。你可以占领 $u$ 当且仅当:

  • 所有已占领的点权和 $\leq P_u$。
  • 存在一个已被占领的点 $v$ 满足边 $(u,v)$ 存在。
    你需要对所有点都求出其作为 $s$ 时,在开始需要多少额外兵力才可占领所有点。

实际上不是很难,想复杂了。
考虑每条边的边权设为 $max(P_u,P_v)$,当前连通块的点权和大于该边则可以直接通过,否则就要加额外兵力,那么实际上实在建生成树。
建出 kruskal 重构树,对于非叶子节点(点权为 $w_u$),左右两棵子树内部的点要互相到达,左子树内的点权和 $sl$ (sum in left subtree)必须大于该节点的边权限制,否则左子树内部的点的答案需对 $sl-w_u$ 取 $max$,右子树同理。
代码很好写。

Test 12.10 T2&&T3

T2 省流:维护二维区间内一次函数最大值,用 扫描线+线段树套李超树解决。考场想到了,但那又有什么用呢?
T3 省流:什么玩意的五维 dp,不会,点 这里 跳楼。

然后发现有人试图用 O(n^2) 瞎几把过 T2,好像卡卡常还真能过?

改题

然后今天一天都在红温,瞎几把改。

2024.12.11

上午考试

喜提爆零。

Test 12.11 T1

神秘算法,乱几把建图然后跑有向图最小树形图。关键还需要左偏树/平衡树优化。

Test 12.11 T2

不会 dp 套 dp。最近怎么这么多 dp 套 dp?

Test 12.11 T3

斐波那契好题。后面的数据结构不会维护。

P11364 [NOIP2024] 树上查询

NOIP T4。
搞了半天终于做懂了。
考虑区间 lca 为区间内每两点之间的 lca 中深度最浅的那一个,那么我们可以建出笛卡尔树(不建也行,只要找到每两个点之间 lca 为最小值对应的极大区间 $(x,y)$ 即可,权值为 $dep_{lca(i,i+1)}$)。那么询问即为与给定区间 $[l,r-1]$ 相交至少为 $k-1$ 长的区间中最大权值。
两种情况分讨即可:

  • $y\geq r-1 \wedge x\leq r-k+1$。
  • $y-x+1\geq k-1\wedge l+k-1\leq y\leq r-1$。
    然后就把修改(初始化的所有区间视作添加)询问扔一块,分别扫描线:前者按照 $r/y$ 从大到小排序做,后者按照 $(k-1)/(y-x+1)$ 从大到小排序做,注意修改需在询问前做的限制。
    然后两种情况取最大值,$k=1$ 时单独处理,就做完了。根本不需什么树上启发式合并的抽象玩意。

P10614

模拟赛考了两次 dp 套 dp,故写了板子题。

2024.12.12

上午

听讲。啥都没听懂。

P4590 [TJOI2018] 游园会

还是 dp 套 dp 板子。

2024.12.13

模拟赛 T1 && P5863 [SEERC2018] Numbers

改了题。还算好写吧。

AT_abc261_h [ABC261Ex] Game on Graph

老师要求的题单里的一道。有向图博弈中比较经典的一类。稍微有些变式。
dp 方程转 dijkstra 比较巧妙,我这样的菜逼没接触过。

2024.12.16

闲话

前几天放假,耍水,只字未动。

AT_abc264_h [ABC264Ex] Perfect Binary Tree

树形动态 dp。实际上暴力修改都行,而且复杂度正确。
但是 rz 数组越界卡了我 30min,不望周知。

P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II

莫队二次离线,比较有意思的一个科技。
字面意思,将莫队的查询再离线下来,使用值域分块之类解决。
小细节写出问题了,被硬控一天。

2024.12.18

AT_abc283_h [ABC283Ex] Popcount Sum

中间在摆烂。
类欧,不会,学了一下,公式还是背不住,不背了,摆大栏。

2024.12.26

不要在意时间。

AT_abc313_h [ABC313Ex] Group Photo

将 ab 数组从大到小排序后连续段 dp,新加入一个数实际上就是考虑合并的一些问题,包括新开一个连续段、放在已有的连续段的左右两边、合并两个连续段。竟然比较简单。

CF1965C Folding Strip

可以考虑一个贪心:遇到相邻的就折。非常粗暴,关键是还是对的。

2025.1.4

woc 在复习物理合格考的时候被赶回来学 OI。

P3690 【模板】动态树(LCT)

重新写了一遍。现在总算会用了。

P3203 [HNOI2010] 弹飞绵羊

LCT 裸题。甚至不用换根,所以断边有一种非常巧妙的写法。
实际上这种情况的断边就是 splay 上取消联通性。加边直接连轻边即可。

2025.1.5

P1501 [国家集训队] Tree II

同板子。
调了 0.5h,原因是区间加没有乘上 $sz$。
我唐完了。

2025.1.6

P2486 [SDOI2011] 染色

可以用树剖,而且这样直接暴力思路就行。
但是合并区间很麻烦,不如写 LCT。
考虑转边权。两端点颜色不同,为 1;否则为 0。
答案即为路径边权和再加 1。
注意结点需维护 splay 子树内最左和最右的颜色;warning:区间取反时需要把这个也取反(没取反调了 10min)。
然后轻松过。

LCT 学习链接

有点好用

P7219 [JOISC2020] 星座 3

考虑建笛卡尔树,发现这样比较复杂,所以不建了(雾)。
考虑反悔贪心,也比较麻烦,所以不考虑(大雾)。
如果从下往上考虑,可以直接贪心:当前的星星与下面的一坨星星冲突,那么要么舍弃当前,要么舍弃下面那一坨,则有贪心:直接舍弃权值较小的那一方。看起来很扯淡,但是是对的。感性理解吧。
实际上是一个笛卡尔树合并的过程。由于大区间必然覆盖掉子树内所有小区间,所以这样是对的。
非常妙。从下往上,用并查集和树状数组来维护冲突的价值和。

P1195 口袋的天空

我也不知道我为什么写这个黄题。估计是想爆切水题了。

2025.1.7

P4219 [BJOI2014] 大融合

LCT 可以考虑维护子树和之类的问题了。
比如子树和:具体做法就是每个点维护 $si$ 表示虚儿子的子树和。只需要在 access、link、cut 三个操作的时候同时更改即可(因为其他的操作不会改变儿子的虚实),pushup 的时候记得加上 $si$,其他部分不变。
这个题这么做就完了。

2025.1.10

P2619 [国家集训队] Tree I

wqs 二分板子。学了一下发现非常简单。所以要多学。

2025.1.11

CF375D Tree and Queries

树上启发式合并板子。我太喜欢板子了。表白板子。

2025.1.17

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

后缀自动机。理解成 parent tree+Trie(有向图) 即可。

P8368 [LNOI2022] 串

下届为 $\frac{n}{2}$,考虑更优:
逆向思考:对于 S 串,逆向变化为:$[i,j]->[i-1,,j-2]->[i-2,j-4]…$。
那么对于初始串 $S[i,j]$,下界为 $min(\frac{n}{2},i-j+1)$。
观察到有一个性质:对于一个出现了两次及以上的子串 $[i_1,j_1],[i_2,j_2]$,那么我们从 $[i_2,j_2]$ 开始,然后不断变化,当左端点跳到 $i_1$​ 时,我们跳回到 $i_2$​ 即可。
一次,我们可以实现两个串之间来回跳,答案为 $r−l+1+(n−r)/2$。
所以记录每个节点最靠左的右端点和串的个数,取最大值即可。
说的很抽象,建议看代码和题解。这里仅用作帮助回忆。

AT_abc272_f [ABC272F] Two Strings

考虑断环为链。串 $A$ 变为 $AA$,$B$ 同理。
然后非常妙的思路是直接将两个拼接在一起。
注意应该是这种形式 $AA+极小字符+BB+极大字符$,原因是题目中要求 $A$ 小于等于 $B$。
然后直接用 SA 数组,求前缀和即可。

P6139 【模板】广义后缀自动机(广义 SAM)

加了一点特判,其余部分照旧。
在线做法应该只有我写的这一种是对的,其他的正确性伪了。
当然也可以考虑一下其他离线做法。

P4770 [NOI2018] 你的名字

PS:(哮喘!)(喘气~)(窒息)(拼命呼吸!)你的名字!
我觉得比较神仙。
先考虑对于所有询问,$l=1,r=|S|$ 怎么做。
建出 $S$ 的后缀自动机,然后让 $T$ 在上面跑匹配,得出 $T$ 上每个结点能在 $S$ 匹配的最长后缀长度 $lim$,答案为 $max(0ll,len-max(lim, len))$。
接下来考虑带 $l, r$ 怎么做。
我们发现我们在匹配时,只需要保证匹配到的 $S$ 子串为 $S[l,r]$ 的子串即可,即 $endpos$ 在 $[l+|S’|, r]$ 之间($S’$ 为匹配到的子串)。
那么用线段树合并来维护每个点上的 $endpos$ 集合,在保证区间能匹配的情况下继续走,否则直接跳 parent tree,最后正常统计答案。
妙啊。

P6292 区间本质不同子串个数

考虑扫描线。用线段树统计区间,LCT 模拟右端点右移的变化。其他的懒得说,SAM 套LCT上线段树+扫描线。

P6335 [COCI2007-2008#1] STAZA

说是跟圆方树相关。实则有做法不用。
由于每条边只能经过一次,那么考虑两个状态:$f_u,g_u$ 分别表示 $u$ 往下走但是最终回来、$u$ 往下走一去不回。
如果走在一条非环边上,则只会对后者造成贡献;否则遍历这个环,对环进行统计。
有个思路就是 $u$ 尽量多走一些环然后回来,最后一去不回(但是不一定把该点上的所有环跑完,可能有一个环走到一半出去了)。那么有 $g_u=f_u+mx$,计算 $mx$ 最大值即可。
太水了,那天重新学习一下圆方树。

P8339 [AHOI2022] 钥匙

每个颜色建虚树,考虑钥匙和宝箱实际上是括号匹配,相当于从钥匙处 dfs,其他钥匙能开的宝箱它就不造成贡献,只有没有其它钥匙了才开。那么转化到 dfn 序上实际上就是一个二维贡献问题,扫描线+BIT 可以过。
注意细节。

P8329 [ZJOI2022] 树

容斥吧。
设计状态 $dp_{i,j,k}$ 表示当前第 $i$ 个数,$[1,i]$ 中有 $j$ 非叶子结点,$[i+1,n]$ 中有 $k$ 个非叶子结点。
但是发现这样容易出问题:如果当前点是叶子结点那是没有问题,问题在于非叶子结点一定有儿子吗?
$O(n^3)$ 复杂度顶天,不可能 $O(n^5)$ 每棵树多记一维状态,那么容斥吧。
实际上实现很简单:比如这个点假设扔给第一棵树当叶子,第二棵树非叶子,那我们用上面的式子减去强制第二棵树是叶子的情况就好了,即 $dp_{i,j,k}=dp_{i-1,j,k+1}\times j\times (k+1)-dp_{i-1,j,k}\times j\times k$(这个系数是乘法原理),反之同理。
然后容斥下来记答案即可。
其实我现在都不是很懂这个题。

AT_arc150_d [ARC150D] Removing Gacha

妙妙期望题。不想写做法了,懒。

后记

留下回忆之处,触着碰着,都是带刺的花。