2025.11 做题笔记

我喜欢你我喜欢你我喜欢你我喜欢你我喜欢你 /qq

不断承受着伤痛
咽下过多少泪流
哀伤的歌总等不到曲终
已经习惯了失落
却还是想吻别冰冷的寂寞
只有那星空永远等着我 拥抱我
依旧是一个人的行走
一个人默默坚守
一个人画出年轮和时间轴
但我已不再孤单哀愁
已不再独享苦衷
只因 那星空的守候

——洛天依《寻遍星空》


洛谷 P11749

思维难度:\(\color{#FFC116} 黄\) *1500

一个结论题(× 细节题(√

考虑一个有点抽象的结论:若 \(s^k\) 中出现了一个长度 \(\ge n\) 的回文串,则这个串可以无限向外延伸。

证明是有点巧妙的。就是考虑举个例子 ......a|...b.. ......a...|b.. 这个串,其中 || 内部是回文的,然后就可以发现 ab 是相同字符,于是就可以归纳地证明了。长度需要 \(\ge n\) 是因为要保证回文串两端的 ab 都会在回文串内部出现至少一次。

然后是推式子。

先考虑奇回文的情况,令 \(s_i\) 为回文中心,则方案数为:

\[\sum _{j=0} ^{k-1} \min (jn + i , (k-j-1)n + (n-i+1)) \]

拆 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\)

\[\begin{aligned} mn+i & \le (k-m-1)n + (n-i+1) \\ 2mn & \le kn-2i+1 \\ m & \le \frac {kn-2i+1} {2n} \end{aligned} \]

至于偶回文,可以发现如果令 \(i\) 为靠左的那个字符,那么就是 min 的右半边减去了个 \(1\),没有太大的影响,不过倒是可能会影响 \(m\) 的取值。

\(m\) 算的好像有一点问题,不过没关系在上面那个式子周围枚举一下就好了。

然后一大坨 corner case。。/tuu

最终调了 5h 没调出来,甚至通过了 gpt 给的 50+ 个 corner case 还是会 WA 大部分点 submission

扔掉了。

天依宝宝可爱!


AT_arc166_d

思维难度:\(\color{#FFC116} 黄\) *1300

就是第一眼显然是个二分,但是写 check 的时候发现这个 check 就能直接做这个题了()

submission

天依宝宝可爱!


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\) 算前驱后继的时候算上了。

submission

天依宝宝可爱!


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\) 产生的贡献之前就算掉这条边的贡献,正确性是因为除了这条边之外,不会再有其它的边会使得该边两边的子树大小产生变化。

submission

天依宝宝可爱!


洛谷 P7794

思维难度:\(\color{#F39C11} 橙\) *1000

蛙趣这个题太好玩了qwq,缺点在于过于简单(?

8 个图.pdf

显然是先对有两个或三个颜色分析,再乘个组合数。下面默认用居中公式表示方案数。

() 表示一个颜色块,颜色块可以呈包含关系;| 表示两个颜色块直接不相邻。

  1. 毛毛虫

    容易注意到是一条有 \(20\) 个点的链。

    • 两个颜色

      显然只能交替填色。

      \[2 \]

    • 三个颜色

      第一个点有 \(3\) 种选择,后面都只有 \(2\) 种。不过要扣掉只有两个颜色的情况。

      \[3 \times 2^{19} - 3 \times 2 \]

  2. 房子

    • 两个颜色

      不可行。

      \[0 \]

    • 三个颜色

      考虑拆成 (())(()()|()())() 的形式,并钦定最右边那个 () 的颜色,发现那个 ()() 共有 \(2\) 种方案,剩下的每个都有 \(2\) 种方案。

      \[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\) 的排列,然后里面那两个颜色是确定的,但是可以互换。

      \[3! \times 2 \]

  6. 砖堆

    一坨三元环。

    • 两个颜色

      \[0 \]

    • 三个颜色

      自顶向下找规律,顶上 \(1\) 个砖块方案数显然是 \(3\);再往下 \(2\) 个砖块方案数为 \(2\);然后 \(3\) 个砖块,似乎就只有一种方案?

      注意到,当一个三元环中两个点的颜色确定后,这个三元环的颜色也就固定了,所以只要顶上 \(1+2\) 个砖块确定了整个砖堆也就确定了。

      \[3! \]

  7. 小花

    注意到中间叶子的三元环可以转化为花枝包含两片叶子的三元环,所以可以拆成 ()(()()|()())(())

    • 两个颜色

      \[0 \]

    • 三个颜色

      \[3 \times 2^5 \]

  8. 这是一个 \(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\)

submission

天依宝宝可爱!


洛谷 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} \]

submission

天依宝宝可爱!


洛谷 P2606

思维难度:\(\color{#F39C11} 橙\) *1000

\(\binom n m \bmod p\)\(n \ge p\) 时,需要用 lucas 去求组合数,因为预处理阶乘会出现 \(n! \equiv 0 \pmod p\) 的反人类直觉情况。

submission

天依宝宝可爱!


洛谷 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\) 的式子:

\[f_i = \sum _{|S|=i} \prod _{x \in S} a_x \]

难点在于 pushdown。考虑如何更新 \(f_i\),式子:

\[f_i' = \sum _{|S|=i} \prod _{x \in S} (a_x + v) \]

暴力展开,按照 \(v\) 的相同次幂合并同类项之后,得到:

\[f_i' = \sum _{|S|=i} \sum _{j=0} ^i v^{i-j} \left( \sum _{T \subseteq S \land |T|=j} \prod _{x \in T} a_x \right) \]

即在 \(S\) 中选 \(j\)\(a_x\) 连乘的结果求和再乘上一个 \(v^{i-j}\)

注意到后面那个括号里的和 \(f_j\) 的表达式很像,启示我们往 \(f_j\) 上凑。

先交换求和顺序:

\[f_i' = \sum _{j=0} ^i v^{i-j} \left( \sum _{|S|=i} \sum _{T \subseteq S \land |T|=j} \prod _{x \in T} a_x \right) \]

令当前线段树区间长度为 \(k\)。考虑每个 \(T\) 会被选多少次,也就是「包含大小为 \(j\) 的子集 \(T\) 的」大小为 \(i\) 的集合个数,显然可以组合数算,考虑固定集合 \(T\),在剩下的 \(k-j\) 个元素中选 \(i-j\) 个作为 \(S \setminus T\),方案数为 \(\binom {k-j} {i-j}\)

于是得到:

\[f_i' = \sum _{j=0} ^i v^{i-j} \sum _{|T|=j} \binom {k-j} {i-j} \prod _{x \in T} a_x \]

把组合数拿出来,后面那一坨就可以替换为 \(f_j\) 了,得到:

\[f_i' = \sum _{j=0} ^i v^{i-j} \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 挺能过的。

submission

天依宝宝可爱!


洛谷 P12837

思维难度:\(\color{#FFC116} 黄\) *1400

就是想不到,这辈子都不会做数数题了 /ll

祈祷 NOIP 不会把数数放在 AB 吧。。

做法就不说了,这篇题解讲得非常清楚。

submission

天依宝宝可爱!


AT_agc034_e

思维难度:\(\color{#F39C11} 橙\) *1200

远古题目难度评分偏高。直接 dp 就好了吧,甚至不用换根。

不过需要处理一些特殊情况,但是我的代码并没有考虑全,怎么办呢?

  • 首先,这是一个最优化问题
  • 注意到,我们的做法会漏掉一些情况(一些有解的情况被误判为无解),但是只 WA 了 \(6\) 个点
  • 于是我们充分发扬人类智慧,将边排序,这样就只 WA 了 \(4\) 个点
  • 继续充分发扬人类智慧,正序和逆序分别做一遍,就可以 AC

submission

天依宝宝可爱!


洛谷 P10138

思维难度:\(\color{#FFC116} 黄\) *1300

数数题就是这样……要不是毫无头猪,要不就和这个题一样,有一个大体思路,但是总是写完了一测样例就发现考虑错了某种情况,修修补补越改越麻烦,关键是一堆问题还没法同时发现,永远不知道还有多少 bug,最后浪费的很多时间喜提 0pts。

关于这个题,就是注意到一个结论「不可能存在两个区间 \((a_i,h_i)\)\((a_j,h_j)\) 相交(但是可能包含)」就做完了,直接 dp 即可。

结论注意到了啊,dp 也想到了啊,但是式子真的没办法两三遍就推对的啊…

submission

天依宝宝可爱!


[补]洛谷 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)\) 是允许的。

submission

天依宝宝可爱!

posted @ 2025-11-04 11:03  little__bug  阅读(20)  评论(0)    收藏  举报