1月刷题
2025.1.13
P9546 [湖北省选模拟 2023] 山路长环 / ring
优点:基本上是独立想出来的。
注意:
根据直觉和数据范围,可以想到一定是得到一个博弈的结论然后数据结构维护。
所以关键在于如何得出结论,首先奇环是必胜的,需要分析的只有偶环。
若环上存在边权为 \(0\) 的边,那么环就被拆成了链,链是简单的,只需要往长度为奇数那边走就好了,所以奇链全都必胜,偶链上一半的点必胜。
若环上没有边权为 \(0\) 的边,考虑偶环断了一条边之后是奇链,所以谁先断了环那么谁必输,这也就代表着谁先走了边权为 \(1\) 的边谁必输。这时大胆猜想谁先走边权为最小值的边谁必输,仔细分析一下,由于是偶环,若一个人走了边权为最小值的边,那么另一个人后续无论如何都不会改变边权的全局最小值,这就代表着先走边权为最小值的边的人最后一定是断环的那个。
所以把边权为最小值的边看为 \(0\),这样就断成了若干条链,线段树简单维护即可。
P11472 命运黄之瓜
缺点:不会。
Trick:若干个多元组进行异或,可以把一个多元组拼成一个二进制数插入线性基中,最终线性基中 \(\log v\) 个数完全等价于初始的 \(n\) 个多元组。
注意:
二分答案很容易想到,关键在于如何判定。
根据上述 Trick,我们可以先把二元组数量缩成 \(\log v\) 个,然后由于线性基第 \(i\) 位存的数字其二进制最高位的 \(1\) 即为第 \(i\) 位,所以二元组中前面那一元(设为 \(x\))具有单调性。
有了单调性这个东西就比较好处理,从左向右贪心,设 \(s_x\) 为 \(x\) 的异或和,同理可得 \(s_y\)。
当前处理第 \(i\) 位是否选择,若 \(s_y\) 在 \([i+1,n]\) 中的线性基中的最大异或和 \(<k\) 那么必选,否则如果 \(s_x\oplus x_i>s_x\) 并且 \(s_y\oplus y_i\) 在 \([i+1,n]\) 中的线性基中最大异或和 \(\ge k\) 那么贪心的我们也要选。
虽然整体看起来不难,但是自己不太能独立想出,要多强化这种题。
P11471 时空轮回
缺点:想不到。
注意:
这题没想到不太应该。
字符串总长确定了,那么所有字符串的本质不同长度一共最多只有 \(O(\sqrt n)\) 种,同时一个长为 \(k\) 的字符串只能匹配一个本质不同的长为 \(k\) 的串。
那么我们就可以对于每个长度,把对应的所有字符串哈希值放入哈希表中,然后从根开始 \(dfs\) 贪心匹配。
P9607 [CERC2019] Be Geeks!
优点:思路很顺,写的不慢。
缺点:时间复杂度有点劣。
注意:
极值分治后启发式分裂,二分出 \(\gcd\) 相同的段计算,感觉没啥思维难度,时间复杂度 \(O(n\log^2 n\log^2 v)\)。
一个比较优的做法是极值分治后像猫树那样从 \(mid\) 出向 \(l\) 和 \(r\) 划段,也没啥思维难度,时间复杂度 \(O(n\log^2 v)\)。
一个更优的做法可以参考这个题,时间复杂度 \(O(n\log v)\)。
P10785 [NOI2024] 集合
缺点:猜的结论自己不太会写,详见。
注意:
出现位置集合构成的可重集相同一定是合法的,加法哈希即可,直接异或哈希是错的,因为异或哈希只统计出现次数的奇偶性,而不区分出现次数。
2025.1.14
P8421 [THUPC2022 决赛] rsraogps
缺点:不会历史和。
注意:
扫描线右端点,同时维护 \(s_l\) 代表 \(L\le l,R \le r\) 的区间和,右端点右移只会影响一段后缀,由于每个点只会被修改 \(\log n\) 次,所以直接暴力更新即可,感觉没有黑。
CF1975F Set
缺点:读错题了,读题能力要注意提升,加强思维训练。
注意:
首先 \(2^n\) 枚举 \(S\) 再检查是否满足 \(2^n\) 个约束是很劣的,考虑如何优化。
发现如果两个数只有一个二进制位不一样的话,那么他们两个对于一半的约束来说是一模一样的,根据这个例子可以想到按位确定,
从最高位开始分当前位是 0/1,发现是相同子问题,于是可以分治下去,复杂度 \(O(n2^n)\),做题时能否构建这样的思维链条是及其重要的,特别注意。
P11364 [NOIP2024] 树上查询
缺点:赛时去想启发式合并维护编号连续段了。
Trick:区间 \(LCA\) 深度为 \(\min_{l\le i<r}{\text{dep}_{\text{LCA}(i,i+1)}}\)
注意:
根据上述 Trick 可以比较容易地转化为二维偏序,用单调栈预处理出来一个 \(\text{dep}\) 能作为最小值的区间,然后两种情况各跑一边扫描线取最优,思路顺下来代码写起来没有任何难度。
P1527 [国家集训队] 矩阵乘法
优点:自己做出来的,思路比较顺,感觉整体二分写的不怎么生疏了。
注意:
这种东西整体二分之后就是查询矩形内 \(1\) 的个数,这个用数据结构很好处理。
P3250 [HNOI2016] 网络
优点:\(O(o\log^3 n)\) 做法很好想,自己写出来的。
缺点:复杂度劣,极限能过。
注意:
答案满足可二分性的尽量不要忘记想一下二分答案。
P6645 [CCO2020] Interval Collection
经典问题:每次添加或删除一条线段,动态维护 \(\min\limits_{r_i\le l_j}{r_j-l_i}\)。
注意:
上述经典问题即为本题唯一要动脑子解决的问题,想到线段树是比较容易的,那么线段树同时比较套路地维护一下左端点在当前区间的最小右端点,右端点在当前区间的最大左端点,这样就能合并两个子区间了,整体来说比较好想。
P5283 [十二省联考 2019] 异或粽子
优点:由于做过超级钢琴,所以这题秒了。
Trick:\(O(n^2)\) 个区间里面选 \(k\) 个使答案最优,用堆维护,每次取出堆顶同时放入次优值。
注意:
\(O(n^2)\) 个里面选 \(k\) 个使答案最优的问题,上述的一个比较经典的 Trick 可以解决这种问题,详见。
本题只需要建一个可持久化 0/1 Trie 即可,代码极其好写。
当然这种恰好 \(k\) 个 wqs 二分也是要首先考虑的,不过这题不是。
2025.1.15
CF241B Friends
优点:思路很顺,感觉很板,很快就想出来了。
注意:
本题由于 \(k\) 没有限制,所以并不能用上一道题的 Trick,所以如何快速求出前 \(k\) 大的和呢?
很容易能想到(也只能这么想)二分答案找出第 \(k\) 大的数值,这个是平凡的。
关键问题是求出一个数和 0/1 Trie 的一个子树中包含的数的异或之和,由于没有什么很好的性质,我们只能牺牲空间,在 0/1 Trie 每个结点开一个数组 \(f_{i,j,0/1}\) 代表 i 子树中包含的数第 j 位为 0/1 的个数。
CF1055F Tree and XOR
缺点:按位确定向下递归的过程想成了不可做,而且不会滚空间的 0/1 Trie。
注意:
滚空间的 0/1 Trie 一点也不难,要记住。
像这种分好多分支向下递归的就不要考虑真的带着限制向下递归,每个点开一个指针各自走各自的就行了!!!
P3736 [HAOI2016] 字符合并
优点:想出来了 \(O(n^32^{2k}k)\) 做法。
缺点:最后优化为 \(O(n^32^k)\) 有点卡壳。
注意:
n 的范围和 k 的范围很容易让人想到区间 dp 和状压,细想一下确实可行。
直接暴力 dp 复杂度是 \(O(n^32^{2k}k)\) 的,考虑优化。
观察到一个很重要的性质就是同一个方案会在多个分割点被重复统计,于是我们只在最后一个分割点统计,减少了重复的枚举,也使得状态更容易转移。
P6105 [Ynoi2010] y-fast trie
缺点:非强制在线没想到线段树分治。
Trick:
一般最优化数对的题,都是先弄出个 \(O(n^2)\) 的解法,再看看这些对数是否满足什么限制,使得某个数对 \((i,j)\) 一定比 \((j,k)\) 优,这些数对一定很少且一次修改涉及的对数不多,所以我们只需要维护这些数对。
注意:
强制在线的话一旦开始考虑维护每个数的最优匹配那么就进行不下去了,因为删除一个数会影响 \(O(n)\) 个数的最优匹配。
根据上述 Trick,我们只维护互为最优匹配的对,即最优数对,答案显然是出于其中。
唯一要解决的就是如何维护。比较暴力的,我们每加入一个数,找出它的最优匹配,最优匹配的最优匹配,最优匹配的最优匹配的最优匹配,分别记为 \(x,y,z,k\)。若 \((x,y)\) 比 \((y,z)\) 优,那么 \((x,y)\) 则为新增最优匹配对,若 \((y,z)\) 之前为最优匹配对,那么删去。删除同理。
这种题最怕的就是想复杂了,希望做题时能冷静一点,多考虑一些东西。
[ARC173D] Bracket Walk
缺点:这种题一点思路都没有,只会靠运气猜
结论:若一个环左括号等于右括号数,那么一定有一个起点满足回路合法。
注意:
上述结论比较显然。因此,若整个图全都是左括号等于右括号的环,那么一定合法。
另一种合法情况就是既有左括号大于右括号的环,又有左括号小于右括号的环,这个赛时感觉只能感性的去猜。
碰到这种题先不要过度深入思考,很容易把问题想复杂然后陷进去,有时候猜几个结论不失为一种上策。
[ABC223H] Xor Query
优点:秒了
缺点:复杂度劣
Trick:区间线性基可以离线扫描线之后贪心保留后放入的。
注意:
思考过程的话我是先考虑的线段树维护区间线性基,发现三个 log 寄掉了,再考虑的回滚莫队,\(O(n\sqrt m\log v)\) 也不行,然后发现分治一下两个 log 好像能跑。
不过正解这种 Trick 确实也比较常见,不应该没往这方面想。
[ARC171D] Rolling Hash
经典问题:给一个一般图染色,要求一条边相连的两个点颜色不同,求最小颜色数量。
注意:
上述问题即为本题核心问题,由于 n 很小,考虑状压 dp。
设 \(f_S\) 为将 \(S\) 的导出子图染色的最小颜色数,枚举子集独立集 \(T\),那么 \(f_S = \min(f_S,f_T+1)\)。
这个问题要记牢。
还有一个问题就是后缀哈希能去除 B 的影响,不要忘记。
2025.1.16
P5840 [COCI2015] Divljak
优点:自主完成
Trick:若干点到根路径并,考虑类似虚树将点按 dfn 排序,每个点到根链加 1,相邻两点 LCA 到根链减一即可。可转化为单点加子树求和。
注意:
给小串减 AC 自动机是好想的,唯一的问题是添加的一个字符串不能重复贡献。
使用上述 Trick 可以解决。
GEN - Text Generator
优点:自主完成
注意:
经典的 ACAM 上 dp。首先答案可以容斥为总串数减去不合法串数,接下来我们只需要 dp 不合法的串数。
设 \(f_{i,j}\) 为 长度为 i 停留在结点 j 的串数,转移注意不要走到能匹配上字符串的节点,时间复杂度 \(O(26L|S|)\),不能通过,上矩阵。
P3502 [POI2010] CHO-Hamsters
优点:自主完成
经典问题:求一个字符串的后缀和另一个字符串的前缀的最长公共部分的长度。-->前一个串跑后一个串的 KMP 可以解决。
注意:
关键的性质是每个串互不包含,\(f_{i,j}\) 代表出现 i 次最后是 j 字符串出现的最短长度,上矩阵维护。
P4569 [BJWC2011] 禁忌
优点:自主完成
知识:f 为当前期望,g 为当前概率,下一步转移概率为 p,权值为 v,则 \(f=f\times p+v\times g\times p,g=g\times p\)
注意:
分别记录长度为 i 时在结点 j 的期望和概率,若走到匹配上字符串的结点为了防止重复匹配,转移到 0 结点,上矩阵维护。
P3715 [BJOI2017] 魔法咒语
优点:独立完成
注意:
禁忌串建 AC 机,预处理 \(to_{i,j}\) 表示在 i 结点,后面接上 j 串后到达的结点,若中途匹配上禁忌串则为 -1,设 \(f_{i,j}\) 表示长度为 i 在 j 结点的贡献。
对于 L 很大的发现基本词汇长度很小,上矩阵维护。
P8147 [JRKSJ R4] Salieri
优点:独立完成
Trick:一个串在 ACAM 上走过的结点建成虚树,点到其父亲链上的字符串被匹配次数相同。
注意:
二分答案之后,对于一个点到其虚树父亲的链上由于所有串的出现次数相同,那么就是查询树链大于等于一个数的个数,最开始先在树上建出来主席树就可以直接查询了。
2025.1.18
P5641 【CSGRound2】开拓者的卓识
知识:
从 0 开始标号的 \(a_0=1\) 的序列的 k 阶前缀和第 \(i\) 项为 \(\binom {i+k-1}{k-1}\)。
从 0 开始标号的 \(a_{0,0}=1\) 矩阵的 k 阶二维前缀和 \((i,j)\) 为 \(C_{i+k-1}^{k-1}C_{j+k-1}^{k-1}\)。
经典问题:
- 描述一
求有多少组区间 \([l_i,r_i]\) 满足 \(i\in[l_{k-1},r_{k-1}]\subseteq [l_{k-2},r_{k-2}]\subseteq\dots\subseteq[l_1,r_1]\subseteq [1,r]\)。
SOL:
由于是相邻区间之间是包含关系,故 \(i\geq l_{k-1}\geq l_{k-2}\geq\dots\geq l_1\geq 1\),记 \(d_k=i-l_{k-1},d_{k-1}=l_{k-1}-l_{k-2},\dots,d_2=l_2-l_1,d_1=l_1-1\),那么有 \(d_1+d_2+d_3+\dots+d_k=i-1\),其中 \(d_i\geq 0\),采用隔板法可求得所有 \((l_1,l_2,\dots,l_{k-1})\) 的个数为 \(\dbinom{i+k-2}{k-1}\)。同理可得所有 \((r_1,r_2,\dots,r_{k-1})\) 的个数为 \(\dbinom{r-i+k-1}{k-1}\)。
- 描述二
将初始区间 \([j,j]\) 扩展 \(k\) 次的方案数
SOL:
可以把它想成这样的模型:
有一个 \(n\times m\) 的网格,从 \((0,0)\) 开始走 \(k\) 步,每步只能走到横纵坐标均大于等于当前点的位置,求到达 \((i,j)\) 的方案数。
其实就是做 k 次二维前缀和,根据上方 Trick可得方案数为 \(C_{i+k-1}^{k-1}C_{j+k-1}^{k-1}\)。
[ABC389G] Odd Even Graph
最短路显然是从 1 开始 bfs 分层,最后是要对每个 \(m\) 求奇数层点数等于偶数层点数的方案数。
很显然是一个计数 dp。
那么我们可以根据 bfs 的过程逐层添加点,具体的,设 \(f_{0/1,i,j,l,k}\) 为上一层为偶数/奇数层,奇数层共有 \(i\) 个点,偶数层共有 \(j\) 个点,上一次有 \(l\) 个点,一共连了 \(k\) 条边的方案数,每次枚举这一层添加的点数 \(a\) 和边数 \(b\) 即可。
一个值得注意的细节就是当前层不仅可以向上一层的点连边,他们也可以在本层互相连边,这样并不会影响 1 到他们的最短路。
设 \(g_{i,j,k}\) 为 当前层 \(j\) 个点向上一层 \(i\) 的点连边,加上本层间的边
共有 \(k\) 条边的方案数。
那么有如下转移(省略取模):
现在仅剩的问题是如何求出 \(g_{i,j,k}\) 。
设 \(t_{i,j,k}\) 为本层 \(j\) 个点仅向上一层 \(i\) 连边,本层间不连边的方案数。那么我们可以枚举新添加的这个点与上一层的连边条数,有:
求完 \(t\) 数组后枚举层间的连边数求出 \(g\) 数组,如下:
总时间复杂度为 \(O(n^8)\),但是这种维数比较多的 dp 有效状态数并不多,循环枚举的时候卡一下上界和下界就会发现常数小到离谱。