一轮复习
我现在什么都做不到了。
我是被遗弃的孩子吗?
我意识到了一些东西,但是我无法对此做出改变。
能打败少部分人又能怎么样呢?难道进队看的是打败的那少部分人吗?
观察,观察。发现今年进队的正常选手只有一位。而且明年我们还会有两名同学占到省队名额。
三分之一线已经被卡满了。
虽然有种绝望的窒息感,但是这都是我自己换取来的。我得准备后事了。
我还有半年时间可以被浪费。我觉得这根本不可能。
我完全在咎由自取。
这篇文章仅用于记录口胡理解的题。
STAGE 1
https://www.luogu.com.cn/problem/list?type=luogu&difficulty=6&page=4&tag=2 ,101,300,301,302,303,304,305,325,329,474。
我当然是个自大的人,这点是毋庸置疑的。
但是实力匹配不上就显得我比较小丑了。
经典的德不配位,位不配德,高开低走,眼高手低,无才无德。
P15725 [JAG 2023 Summer Camp #3] LCP Queries
看起来很吓人的题目。
不过都是前缀,而且求的是 \(\sum\limits_{i=1}^n \text{LCP}(s_i,u)\)。没有其它复杂的东西,考虑 Trie 树。发现答案就是将 \(u\) 尽量匹配后的 \(cnt\) 之和。
\(u\) 很长。考虑二分匹配长度,用哈希进行 check。
unordered_map 大概可以做到单 \(\log\)。
P15549 「Stoi2037」不能说的秘密
给你 \(z\) 函数,问你字符串方案数。
我真是一点都不想看到类似的题目了。
P15146 [SWERC 2025] LFS
https://www.luogu.com.cn/problem/P15146
给你一个字符串,问你某个区间里出现次数最多的子串的最长长度。多次询问。
观察发现,最多出现次数显然是单个字符的最多出现次数。
于是这个最长子串的出现一定两两不交,并且其组成字符两两不同。
考虑字符 \(a\) 后面能接字符 \(b\),当且仅当在 \([l,r]\) 中,每个字符 \(a\) 后面都是字符 \(b\)。这样连一个图出来,点数为 \(\Sigma\),最长链即为答案。
怎么 check 这个东西呢?预处理 \(p_i\) 表示,满足 \(p_i\) 这个字符后面的字符都相同,最远的 \(r\) 能扩展到哪。于是每次看每个字符在 \([l,r]\) 里的第一次出现对应的 \(p\) 就行了。
B - First of Her Name
https://www.luogu.com.cn/problem/P6257
问你 \(s\) 时多少个串的前缀。把 \(s\) 和所有串翻转。原树变成一棵字典树,问题变成 \(s\) 是多少个串的后缀。
假如这个字典树是一条链,那么询问的其实是 \(s\) 在这个串里的出现次数。
这个东西不太好做啊。AC 自动机解决的问题是多模式串匹配,但这里问的是这个串在其它串里面的出现次数。
于是我们直接,把询问串建出 AC 自动机。然后让这个 Trie 树在上面跑就行了。
这个我在初学字符串的时候就被坑过了:
- 设 \(occ(A,B)\) 为 \(A\) 在 \(B\) 中的出现次数,则 \(\sum_{i=1}^n occ(s_i,t)\) 是可以预处理后简单求的,\(\sum_{i=1}^n occ(t,s_i)\) 是不太好求的。
P8147 [JRKSJ R4] Salieri
https://www.luogu.com.cn/problem/P8147 。
AC 自动机,虚树,线段树维护链上值的出现次数,二分套线段树。总之做到双 \(\log\) 是简单的。
P16315 [ICPC 2023 Jinan R] 基本子串结构
https://www.luogu.com.cn/problem/P16315
这个题比较简单。对着题意观察一下就能出做法,甚至不需要什么转化。
我们大概晚上来补题吧。下午多看点题。如果我还是不会 C 的话就可以看题解了。
P13259 [GCJ 2014 #2] Trie Sharding
非常聪明的题目。花 10min 想到了第一问的做法,但是是猜的。
考虑一个前缀 \(t\),设它在 \(c_t\) 个 Trie 上出现过。容易发现点数总数就是 \(\sum c\)。于是我们想让所有前缀都在尽可能多的字典树上出现。
设 \(d_t\) 为 \(t\) 作为前缀在 \(s\) 中的出现次数。将它给出的 \(s\) 排序。然后把 \(s_i\) 放进第 \(i\bmod n+1\) 个 Trie 里。因为排了序,所以一个前缀只会在一段区间的字符串里出现,因此 \(c_t\) 取到了理论最大值 \(\min(d_t,N)\)。第一问做完了。
第二问似乎就比较简单了?
确实。看了一眼题解,看到了 Trie 上 DP,然后就自己做出来了。这题出的很有意思!我真是天才!
具体而言,因为这归根结底还是个和前缀相关的东西,于是考虑 Trie 上 DP。设 \(dp_u\) 表示只考虑 \(u\) 的子树时,全部取到最大值的方案数。有几种情况可以分讨:
- \(siz_u \leq N\)。(这里 \(siz_u\) 指的是 \(u\) 子树里有几个字符串。)
显然,所有字符串都得在不同的 Trie 上。方案数直接就是 \(C_N^{siz_u}\)。 - \(siz_u > N\),且有 \(siz\geq N\) 的子树。
显然,子树就已经能让 \(u\) 达到最大贡献了。于是直接将子树的 \(dp\) 乘起来就可以了。如果 \(u\) 是一个字符串的终点,还要再乘 \(N\)。 - \(siz_u > N\),但是没有 \(siz\geq N\) 的子树。
设序列 \(A\) 中存了 \(u\) 的所有子树的 \(siz\),长度为 \(m\)。如果 \(u\) 是一个字符串的终点,还要在 \(A\) 里加个 \(1\)。现在相当于要解决这样一个问题:有 \(N\) 个小球,\(m\) 种颜色。每个小球需要涂至少一种颜色,且第 \(i\) 种颜色恰好涂在了 \(A_i\) 个小球上。这是一个很简单的问题,可以 \(O(N^2+Nm)\) 容斥做。
貌似做完了。复杂度呢?
复杂度基本上都由第三种情况提供。因为满足条件的 \(u\) 两两不交,所以最多只有 \(O(\frac{M}{N})\) 个。乘上 \(O(N^2)\) 也就只有 \(O(MN)\)。
因为每个点只会对最多一个祖先做出情况三的贡献,所以 \(O(Nm)\) 求和也只有 \(O(NM)\)。于是就做完了!!!而且我写完了!!!
P13723 [GCPC 2024] Headline Heat
好题啊。
判 Yes/No。出现次数相等。应激地考虑哈希。
异或哈希不好。和哈希好。给每个点赋点权,满足一个连通块里点权和为 \(0\)。于是直接 AC 自动机随便判一下就行了。
注意到这和给每个限制赋随机权值,在 \(u\) 那里 \(+w_i\),在 \(v\) 那里 \(-w_i\) 是等价的。
于是线性做完了。
P13034 [GCJ 2021 #1C] Double or NOTing
C - 模板 2 / Szablon 2
把往左的点找出来,把往右的点找出来,我需要查一段区间里的最小值。修改 \(O(n)\) 次,查询 \(O(n\log n)\) 次。就没有什么更快的做法吗?好烦啊。树状数组上二分?
哦对啊,这里就可以用并查集了。哦哦哦。我逐渐理解一切。
它们都连向自己。然后往右边走,尝试往左边连。如果说已经连通了,这个就删掉。如果一个区间不合法了,就将其左端点连向更左边。然而这真的对吗。理论上处理一下也行,我把它删掉了再把另一个加进来就可以了,但总感觉很麻烦。
这不成。还是树状数组上二分吧。至少得试一下。
UPD:极限过题。用哈希写 Z 函数,结果被卡自然溢出了。改改模数啊底数啊就过了。
P13856 [CERC 2023] Labelled Paths
https://www.luogu.com.cn/problem/P13856
也许是典题。DAG 最短路。直接 topo 排序。
不过这个题目充满了误导。给定 \(s\),对任意 \(t\in [1,n]\) 求出 \(\text{dis}(s,t)\)。似乎要从 \(s\) 开始。
但是由于字符串的比大小对长度不相等的字符串也有定义,所以 \(A<B\) 和 \(A+C<B+C\) 并不等价。不过 \(A<B\) 和 \(C+A<C+B\) 是等价的。于是实际上要从 \(t\) 往 \(s\) 拓扑排序(在反图上)。所以实际上可以求任意点对的 \(\text{dis}\)。
考虑枚举起点 \(S\),在反图上拓扑排序。
每个点存若干个区间,代表它的 \(\text{dis}\)。然后还要记录前驱。这都是简单的。
有 \(m\) 次比较操作。要比较两个区间序列。可以二分加哈希,但是不太好。用 SA 就可以做到单次比较 \(O(n)\) 了。于是可以做到单次拓扑排序 \(O(nm)\)。跑 \(n\) 次的时间复杂度就是 \(O(n^2m)\)。
STAGE 2
见贤思齐是什么意思呢。
猜测和贤人有关。再猜测和齐国有关。
我猜错了。
P15505 [CEOI 2012] 帆船比赛 / Sailing Race
不相交啊。考虑区间 DP。
\(dp_{l,r,0/1}\)。表示 \([l,r]\) 中,以 \(l/r\) 为起点时最长能走多少。根据 \(l>r\) 还是 \(l<r\) 来判断逆时针还是顺时针。显然可以 \(O(n^3)\) 做完 \(k=0\)。
P7581 「RdOI R2」路径权值(distance)
这题好难。
可以写一个二维 DP,然后发现可以长剖/线段树合并优化。
STAGE 3
STAGE 是什么意思?
"stage" 一词也有 “阶段” 之意。在《东方》系列里,就是用 STAGE 1/STAGE 2/STAGE 3/STAGE 4/STAGE 5/STAGE 6 等来划分章节的。
https://www.luogu.com.cn/problem/list?type=luogu&page=61&difficulty=5 。
P16591 [GKS 2016 #D] Stretch Rope
设 \(f_{i,j}\) 代表前 \(i\) 根绳子凑出 \(j\) 的最小代价,发现可以单调队列优化。
P16601 [SYSUCPC 2025] Ecosystem
完全背包方案数,物品体积小,询问体积大。
发现 \(f_i\) 只和大概前一百个有关,直接矩阵快速幂做完了。
P16608 [SYSUCPC 2025] Larger or Smaller(可能要写)
先处理 \(f_{i,j}\),表示长度为 \(i\) 的排列的错排,大于位置为 \(j\) 的方案数。得到原来答案只需要钦定一些相等位置就行了。
既然是错排,考虑到置换环上。\(f_{i,j}\) 随便插入一个 \(i+1\),有 \(j\) 种情况不变,\(i-j\) 种情况大于位置增加 \(1\)。如果拉一个单独出来成二元环,大于位置必定增加 \(1\)。做完了。
P16633 [GKS 2017 #F] Catch Them All
倒着做。矩阵快速幂。
P16280 「MierOI R1」Eternal
分析问题结构:
考虑如何刻画一个合法的方案。在一个合法的方案中,有若干个互不相交或首尾相连的大区间,每个大区间的左右两端挂着一些小区间。具体情况如下图所示:
大区间的能选取区间数是很好计算的。统计答案的时候要处理一下形如 \([i,i]\) 的区间。
P16281 「MierOI R1」Beyond
等我先把 sale 学会来。
P16285 [蓝桥杯 2026 省 Python A 组] 可选数
我谔谔。求最小 \(P\),满足 \(\text{lcm}(A_1,A_2,A_3,\dots,A_n,P)\) 是 \(K\) 的倍数。
可以先取 \(\gcd\) 再求出 \(\text{lcm}\),看哪些质因子没被选完。但不能分解。设这个 \(\text{lcm}\) 是 \(T\),那么 \(\frac{K}{T}\) 有所有我们需要的质因子。用 \(K\) 不断除以这个东西大概就做完了。
P16289 [蓝桥杯 2026 省 Python A 组] 购电优化
显然反悔贪心。保证每个时刻电池都是满的。
到当前这里,如果费用小就直接用,费用大就反悔掉就行了。
P16318 [ICPC 2023 Jinan R] 彩虹子数组
其实是非常典的题。不知道为啥当时没做出来。
看到 \(a_{i+1}-a_i=1\) 或者严格递增这种限制,考虑减下标转成相等或者非严格递增。
对一个区间,其合法需要的最小代价就是全部移动到中位数的代价。双指针线段树随便搞搞就行了。
P16325 【MX-J29-T4】XOR and Swap
注意到操作可逆。考虑中间态 \(C\) 满足 \(p_i=i\)。
现在有 \(p_x\),我们直接把它和 \(p_{p_x}\) 交换,它就会回到自己的位置。
此时需要满足 \(p_x\oplus p_{p_x}\leq x\oplus p_x\)。设 \(p_x=y\),有 \(y\oplus p_y\leq x\oplus p_x\)。这非常的酷炫,我们直接按 \(x\oplus p_x\) 搞一个堆,然后每次取最大的就做完了。
P16335 [DSDOI Round 1] 邓少打音游
差分、线段树随便做。
P16350 「Gensokyo OI Round 1」隙间插曲
设最后剩下 \(k\) 个怪。
发现原问题可以转化为:一次删除操作,要么删除末尾一个数,要么不删除,使得队列最后 \(k\) 个数最大。
设 \(f_{i,j}\) 表示,\([i,n]\) 中保留 \(j\) 个怪的最大价值。
- 若 \(a_{i-1}=0\)。
\(f_{i-1,j}\leftarrow \max(f_{i-1,j},f_{i,j})\)。 - 若 \(a_{i-1}\neq 0\)。
- 若保留这个怪。
\(f_{i-1,j+1}\leftarrow \max(f_{i-1,j+1},f_{i,j}+a_{i-1})\)。 - 若删除这个怪。
直接贪心杀明显是对的。从 \(i-1\) 往后暴力模拟,设至少到 \(c_{i-1}\) 才能杀完。那么这一段肯定全部都杀了,从 \(f_{c_{i-1}+1},j\) 处转移即可。(想杀 \(i-1\) 需要把 \([i-1,c_{i-1}]\) 都消耗掉,于是可以看作这一段不存在,保留下来的后 \(j\) 个就是之前保留下来的后 \(j\) 个。)
- 若保留这个怪。
时间复杂度 \(O(n^2)\)。
P16355 「Diligent-OI R3 C」彼方へ、名もなき海辺より
两个方案不同看起来有点难判,其实很简单。看作每个点连出去一个有向边,那么这其实是个基环树森林。发现只要每个点连出去的边不同,这个基环树森林就一定不同。因为三元环及以上的定向是容易的。环定向做完后,边的定向也是容易的。然后发现二元环也没有区别。于是就对了。
统计基环树森林连通块数,等于统计环的数量。一个环必定是一条链加一条返祖边。于是答案变成了,去掉任意一条单链后,剩余点的方案数之积之和。可以看作是总方案数除以当前链上的积。这个大概一遍 DFS 就能求了,时间复杂度 \(O(n)\)。
P16400 [ECUSTPC 2026 Spring] 朝复夕
找出置换环。环长 \(O(\sqrt n)\) 种。然后非常轻松地就做完了。
P14753 森
笛卡尔树启发式分治加主席树随便做啊,轻松做到 \(O(n\log^2)\)。
发现不分治也可以,轻松做到 \(O(n\log n)\)。
P14756 成都之泪
容易转化为带修最大子段和问题,不太好做。
发现每个位置只会有两种取值,第 \(i\) 个位置未被覆盖时值为 \(b0_i\),被覆盖时值为 \(b1_i\)。于是开两棵线段树,根据删除的区间取出三个区间进行 Tag 合并就行了。
STAGE 4
精神寄托。
STAGE 5
我可能认识几个人。
STAGE 6
生生生生暗生始,死死死死冥死终。
STAGE EX
我们怎么定义“神”?
或者说,具有怎样特性的存在或者非存在被我们称为“神”?
1.“神”必须满足全知全能吗?
2.“神”本身必须未知吗?
3.“神”必须有高于人性的“神性”吗?
4.“神”必须要不能被验证存在吗?
如果你信仰着某个宗教,那么你通常也会信奉着至少一位神明。
如果你不信仰某个宗教,你也可以信奉一位神明。
如果你是一个无神论者,你会认为你不信奉神明。
然而,为了继续接下来的讨论,我会作出一个不成熟的假设,假设你至少不是一个怀疑论者。

浙公网安备 33010602011771号