2025.11 做题笔记
我喜欢你我喜欢你我喜欢你我喜欢你我喜欢你 /qq
不断承受着伤痛
咽下过多少泪流
哀伤的歌总等不到曲终
已经习惯了失落
却还是想吻别冰冷的寂寞
只有那星空永远等着我 拥抱我
依旧是一个人的行走
一个人默默坚守
一个人画出年轮和时间轴
但我已不再孤单哀愁
已不再独享苦衷
只因 那星空的守候
洛谷 P11749
思维难度:\(\color{#FFC116} 黄\) *1500
一个结论题(× 细节题(√
考虑一个有点抽象的结论:若 \(s^k\) 中出现了一个长度 \(\ge n\) 的回文串,则这个串可以无限向外延伸。
证明是有点巧妙的。就是考虑举个例子 ......a|...b.. ......a...|b.. 这个串,其中 || 内部是回文的,然后就可以发现 a 和 b 是相同字符,于是就可以归纳地证明了。长度需要 \(\ge n\) 是因为要保证回文串两端的 a 和 b 都会在回文串内部出现至少一次。
然后是推式子。
先考虑奇回文的情况,令 \(s_i\) 为回文中心,则方案数为:
拆 min,令 \(j \le m\) 时 min 的结果是 \(jn+i\),则:
-
当 min 为 \(jn+i\) 时:
\[\begin{aligned} & \sum _{j=0} ^m (jn+i) \\ = & (m+1)i + n \sum _{j=0} ^m j \\ = & (m+1)i + n \frac {m(m+1)} 2 \end{aligned} \] -
当 min 为 \((k-j-1)n + (n-i+1)\) 时:
\[\begin{aligned} & \sum _{j=m+1} ^{k-1} ((k-j-1)n + (n-i+1)) \\ = & \sum _{j=m+1} ^{k-1} (kn-i+1 - jn) \\ = & (k-m-1)(kn-i+1) - n \sum _{j=m+1} ^{k-1} j \\ = & (k-m-1)(kn-i+1) - n \frac {(k+m)(k-m-1)} 2 \end{aligned} \]
算 \(m\):
至于偶回文,可以发现如果令 \(i\) 为靠左的那个字符,那么就是 min 的右半边减去了个 \(1\),没有太大的影响,不过倒是可能会影响 \(m\) 的取值。
哦 \(m\) 算的好像有一点问题,不过没关系在上面那个式子周围枚举一下就好了。
然后一大坨 corner case。。/tuu
最终调了 5h 没调出来,甚至通过了 gpt 给的 50+ 个 corner case 还是会 WA 大部分点 submission
扔掉了。
天依宝宝可爱!
AT_arc166_d
思维难度:\(\color{#FFC116} 黄\) *1300
就是第一眼显然是个二分,但是写 check 的时候发现这个 check 就能直接做这个题了()
天依宝宝可爱!
CF1981E
思维难度:\(\color{#FFC116} 黄\) *1400
关键是这长得太像 Boruvka 了呀。。
注意到并非 Boruvka,找点性质就很好做了。考虑三元环的情况,发现若三条两两相交的线段满足 \(a_1 \le a_2 \le a_3\),那么只需要连 \((1,2),(2,3)\) 这两条边就足够了,不会更劣。
随便维护即可,用一只扫描线,在一个线段 \(i\) 的 \(l\) 处加入,\(r+1\) 处删除,只在加入的时候算一遍按照 \(a_i\) 排序后的前驱后继即可,并不需要在 \([l,r]\) 内一直维护,因为如果某个 \(a_j\) 在 \(l\) 后出现并且可以成为 \(i\) 的真正的前驱 / 后继,那么就会在对 \(j\) 算前驱后继的时候算上了。
天依宝宝可爱!
CF1770E
思维难度:\(\color{#FFC116} 黄\) *1300
期望好难 ww
显然是把贡献拆到每条边上,\(s_u\) 为 \(u\) 的子树内所有点有蝴蝶的概率 \(f_u\) 之和,但是直接算 \(s_u \times (k-s_u)\) 为什么是不对的呢?
(卡了 1h 一直不知道为什么错。。
是因为,子树内和子树外的点的 \(f_u\) 实际上是互相有影响的,因为存在 \((u,fa_u)\) 这条边,所以在考虑了这条边产生的贡献后,子树内外的概率会互相转移,根据人类直觉这是不正确的,会弄得很乱。
正确做法就是在考虑边 \((u,v)\) 对 \(f\) 产生的贡献之前就算掉这条边的贡献,正确性是因为除了这条边之外,不会再有其它的边会使得该边两边的子树大小产生变化。
天依宝宝可爱!
洛谷 P7794
思维难度:\(\color{#F39C11} 橙\) *1000
蛙趣这个题太好玩了qwq,缺点在于过于简单(?
显然是先对有两个或三个颜色分析,再乘个组合数。下面默认用居中公式表示方案数。
令 () 表示一个颜色块,颜色块可以呈包含关系;| 表示两个颜色块直接不相邻。
-
毛毛虫
容易注意到是一条有 \(20\) 个点的链。
-
两个颜色
显然只能交替填色。
\[2 \] -
三个颜色
第一个点有 \(3\) 种选择,后面都只有 \(2\) 种。不过要扣掉只有两个颜色的情况。
\[3 \times 2^{19} - 3 \times 2 \]
-
-
房子
-
两个颜色
不可行。
\[0 \] -
三个颜色
考虑拆成
(())(()()|()())()的形式,并钦定最右边那个()的颜色,发现那个()()共有 \(2\) 种方案,剩下的每个都有 \(2\) 种方案。\[3 \times 2^5 \]
-
-
锁(疑似)
显然是
((()|()))。-
两个颜色
\[2 \] -
三个颜色
\[3 \times 2^3 - 3 \times 2 \]
-
-
雪人
也是好拆的。
-
两个颜色
\[2 \] -
三个颜色
\[3 \times 2^{13} - 3 \times 2 \]
-
-
车轮(疑似)
开始出现非一个包含另外两个的三元环结构了,发现可以拆成一个三元环,形如
()、()、(()())。-
两个颜色
\[0 \] -
三个颜色
考虑三元环的方案就是长度为 \(3\) 的排列,然后里面那两个颜色是确定的,但是可以互换。
\[3! \times 2 \]
-
-
砖堆
一坨三元环。
-
两个颜色
\[0 \] -
三个颜色
自顶向下找规律,顶上 \(1\) 个砖块方案数显然是 \(3\);再往下 \(2\) 个砖块方案数为 \(2\);然后 \(3\) 个砖块,似乎就只有一种方案?
注意到,当一个三元环中两个点的颜色确定后,这个三元环的颜色也就固定了,所以只要顶上 \(1+2\) 个砖块确定了整个砖堆也就确定了。
\[3! \]
-
-
小花
注意到中间叶子的三元环可以转化为花枝包含两片叶子的三元环,所以可以拆成
()(()()|()())(())。-
两个颜色
\[0 \] -
三个颜色
\[3 \times 2^5 \]
-
-
环
这是一个 \(30\) 元环,最困难的一个了。
-
两个颜色
\[2 \] -
三个颜色
似乎没法算了,但是注意到这里是 OI 而并非 MO,所以可以直接写个爆搜,发现跑到起飞,即可得到答案。
\[1073741826 - 3 \times 2 \]
-
得到答案表格:
| 图片编号 | 两个颜色方案 | 三个颜色方案 |
|---|---|---|
| 1. 毛毛虫 | \(2\) | \(3 \times 2^{19} - 3 \times 2\) |
| 2. 房子 | \(0\) | \(3 \times 2^5\) |
| 3. 锁(疑似) | \(2\) | \(3 \times 2^3 - 3 \times 2\) |
| 4. 雪人 | \(2\) | \(3 \times 2^{13} - 3 \times 2\) |
| 5. 车轮(疑似) | \(0\) | \(3! \times 2\) |
| 6. 砖堆 | \(0\) | \(3!\) |
| 7. 小花 | \(0\) | \(3 \times 2^5\) |
| 8. 环 | \(2\) | \(1073741826 - 3 \times 2\) |
天依宝宝可爱!
洛谷 P6870
思维难度:\(\color{#F39C11} 橙\) *1100
是简单题,但是有一堆做法我只想到了最麻烦的那个。/ll
-
做法一
直接 dp,令 \(f_{i,j,k}\) 为考虑前 \(i\) 个人,用了 \(j\) 个题,恰好 \(k\) 个人合法的方案数。那么枚举第 \(i\) 个人匹配了几个数,有转移:
\[f_{i,j,k} = \binom {n-(j-i)} i f_{i-1,j-i,k-1} + \sum _{x=j-(i-1)} ^j \binom {n-x} {j-x} f_{i-1,x,k} \]只会这个,是 3D1D 的而且看起来不好优化。
-
做法二
这篇题解,一个状态和做法一相同但是 3D0D 的做法,没看懂。
-
做法三
考虑正难则反,令 \(f_{i,j}\) 为前 \(i\) 个人,用了 \(j\) 个题,每个人都不合法的方案数。发现是 2D1D 的,做完了。
\[f_{i,j} = \sum _{x \le j \land x \ne i} \binom {n-(j-x)} x f_{i-1,j-x} \]
天依宝宝可爱!
洛谷 P2606
思维难度:\(\color{#F39C11} 橙\) *1000
当 \(\binom n m \bmod p\) 中 \(n \ge p\) 时,需要用 lucas 去求组合数,因为预处理阶乘会出现 \(n! \equiv 0 \pmod p\) 的反人类直觉情况。
天依宝宝可爱!
洛谷 P10045
思维难度:\(\color{#52C41A} 绿\) *1600
注意到标题为线段树,所以这是一道线段树题。
因为 \(a_i\) 都是奇数,又要取模 \(2^{20}\),所以可以把乘积表示成 \(\prod_i (a_i+1)\) 的形式,于是将 \(\prod\) 展开后,最多不会超过 \(19\) 个位置 \(i\) 选择将 \(a_i\) 放到连乘里(排除掉 \(a_i = 0\) 的情况),不然结果一定会是 \(2^{20}\) 的倍数。
于是 pushup 解决了,线段树维护一个 \(f_i\) 表示选 \(i\) 个非 \(1\) 的 \(a_i\) 连乘的结果之和,暴力背包即可。
同时给个 \(f_i\) 的式子:
难点在于 pushdown。考虑如何更新 \(f_i\),式子:
暴力展开,按照 \(v\) 的相同次幂合并同类项之后,得到:
即在 \(S\) 中选 \(j\) 个 \(a_x\) 连乘的结果求和再乘上一个 \(v^{i-j}\)。
注意到后面那个括号里的和 \(f_j\) 的表达式很像,启示我们往 \(f_j\) 上凑。
先交换求和顺序:
令当前线段树区间长度为 \(k\)。考虑每个 \(T\) 会被选多少次,也就是「包含大小为 \(j\) 的子集 \(T\) 的」大小为 \(i\) 的集合个数,显然可以组合数算,考虑固定集合 \(T\),在剩下的 \(k-j\) 个元素中选 \(i-j\) 个作为 \(S \setminus T\),方案数为 \(\binom {k-j} {i-j}\)。
于是得到:
把组合数拿出来,后面那一坨就可以替换为 \(f_j\) 了,得到:
于是就可以直接 pushdown 了。
至于 query,没必要查询区间的时候 merge,直接把每个查询到的线段树节点 \(u\) 的 \(\sum _i f_i\) 乘起来即可。
复杂度是 \(O(\frac {20^2} 2 (n+q) \log n)\) 的,4s 挺能过的。
天依宝宝可爱!
洛谷 P12837
思维难度:\(\color{#FFC116} 黄\) *1400
就是想不到,这辈子都不会做数数题了 /ll
祈祷 NOIP 不会把数数放在 AB 吧。。
做法就不说了,这篇题解讲得非常清楚。
天依宝宝可爱!
AT_agc034_e
思维难度:\(\color{#F39C11} 橙\) *1200
远古题目难度评分偏高。直接 dp 就好了吧,甚至不用换根。
不过需要处理一些特殊情况,但是我的代码并没有考虑全,怎么办呢?
- 首先,这是一个最优化问题!
- 注意到,我们的做法会漏掉一些情况(一些有解的情况被误判为无解),但是只 WA 了 \(6\) 个点。
- 于是我们充分发扬人类智慧,将边排序,这样就只 WA 了 \(4\) 个点!
- 继续充分发扬人类智慧,正序和逆序分别做一遍,就可以 AC!
天依宝宝可爱!
洛谷 P10138
思维难度:\(\color{#FFC116} 黄\) *1300
数数题就是这样……要不是毫无头猪,要不就和这个题一样,有一个大体思路,但是总是写完了一测样例就发现考虑错了某种情况,修修补补越改越麻烦,关键是一堆问题还没法同时发现,永远不知道还有多少 bug,最后浪费的很多时间喜提 0pts。
关于这个题,就是注意到一个结论「不可能存在两个区间 \((a_i,h_i)\) 和 \((a_j,h_j)\) 相交(但是可能包含)」就做完了,直接 dp 即可。
结论注意到了啊,dp 也想到了啊,但是式子真的没办法两三遍就推对的啊…
天依宝宝可爱!
[补]洛谷 P13342
思维难度:\(\color{#52C41A} 绿\) *1600
很好的小清新莫队题。
\(n \le 10^5\),4s,显然是莫队。
首先发现删掉 \([l,r]\) 相当于在重构树上对于 \(\forall u,v \in [l,r]\) 把 \({\rm lca}(u,v)\) 删掉,当然最多 \(r-l\) 个 lca。
然后考虑莫队,令当前点集为 \(S\),区间扩展时需要加入点 \(u\),那么只需要求出 \(u\) 和 \(S\) 内任意点的 lca 中没被删除的那个就可以了,区间收缩也是等价的。
于是便有了一个双 log 的做法,就是直接对重构树做树剖套线段树,维护子树内没被删除的点的个数即可。不过这个复杂度太大了,足足有 \(O(n \sqrt n \log^2 n)\),完全不能接受。
继续观察,发现这个 lca 就是 \(u\) 与 \(S\) 内点的深度最大的 lca,这有什么用呢?注意到「深度」和「lca」同时出现,于是考虑 dfn(dfs 序),发现这个 \({\rm lca}(u,v)\) 对应的 \(v\) 一定是:将 \(S\) 内的点按照 dfn 排序后,第一个 dfn 比 \(u\) 的 dfn 大的点,或者最后一个 dfn 比 \(u\) 的 dfn 小的点!根据 dfs 序求 lca 的结论这是正确的。于是可以直接用 set 维护 \(S\) 内点的 dfn 做到单 log。
都求 dfn 了当然要 \(O(n \log n) - O(1)\) lca 啦,所以总复杂度是 \(O(n \sqrt n \log n)\) 的,虽然莫队的根号比较小,但是 set 的 log 还是挺大的,但是他给了 4s 啊,卡一卡问题不大的。
不过能不能做到更优?
瓶颈在于 set,考虑能不能用什么东西代替掉它,注意到 set 的作用只是查前驱后继,那么似乎可以用链表去维护这个东西?不过这样插入和查询就变成 \(O(n)\) 的了,删除倒是变成了 \(O(1)\)……
但是我们用的是莫队啊,那只能删除不能插入不就可以了?直接上回滚莫队,发现查询也是 \(O(1)\) 的了!于是便得到了一个 \(O(n \sqrt n)\) 的做法!
没想到回滚莫队还能这么用 w
期间因为各种原因(模拟赛、补题、abc)拉了很长的战线,导致最后不想写了,于是就不写了。
(没写完的)submission
天依宝宝可爱!
洛谷 P6628
思维难度:\(\color{#FFC116} 黄\) *1500
又是神秘方法构造欧拉回路 /jk
显然这个东西跟欧拉路径有关系,但是注意到任意图不一定有欧拉路径。
所以要构造欧拉路径!首先 \(m\) 条边的代价都是确定的,那么只需要考虑新加入的边如何使得代价最小即可。
首先有一个比较神人的转化,就是连边 \(s \to i\),这样后求出来欧拉回路之后,再删掉 \(s \to i\),就能恰好剩下一条 \(s \leadsto i\) 的欧拉路径。
然后把任意图变成有欧拉回路的图,考虑给奇数点之间连边。然后发现因为 \(u \to v\) 的边权为 \(|u-v|\),所以从 \(1\) 到 \(n\) 依次贪心地连边一定不会更劣(证明),于是直接贪即可。
一些需要注意的地方:
- 注意到这样画出来的图不一定连通,所以要建边 \(i \to i+1\),再跑一遍 MST。
- 因为并不是所有点都需要经过,所以上面建边的时候,需要跳过不需要经过的点。需要经过的点就是在 \(m\) 条边中出现过的点以及起点和终点。
- 在奇点 \(u,v\) 之间连边的时候,需要把 \(u,u+1,u+2,\ldots,v-1,v\) 这些点的连通块都合并。
终点可以直接枚举,时间复杂度 \(O(n^2 \log n)\) 是允许的。
天依宝宝可爱!

浙公网安备 33010602011771号