2025.11 做题记录 / 剪断我们之间 连接的红线 就当从未了解里外的花花世界

P7390

先考虑什么样的子结构是合法的,因为题目没有无解,得出条件应该为

  • \(\sum a_i=2(n-1)\)
  • \(1\leq a_i\leq n\)

考虑归纳证明,首先肯定存在 \(a_i=1\) 否则 \(\sum a_i\geq n\),其实肯定存在 \(a_i>1\) 否则 \(\sum a_i=n-1\)。我们拼凑这两个点,并将其视作一个新的点,新的图仍然满足上述条件。

所以我们操作的时候只要保证连接了两个不同的连通块、以及组成的新点仍然有额外的度数即可,最后一条边除外。我们考虑贪心,大的跟大的乘,按 \(b\downarrow\) 枚举点,考虑怎么加边,首先子结构一定是若干度数为 \(d_1,\dots,d_m\) 的连通块,因为历史上能加就加所以肯定不存在两个 \(d_i>1\) 的,不妨令 \(d_1\geq 1\)\(d_2,\dots,d_m=1\),然后用两个队列 \(L/R\) 分别顺序维护连通块 \(1/2\to m\) 的出边。加边的话,特判 \(L\) 为空的,此时直接加入,之后先尽量连 \(R\) 中比 \(L\) 中最大边更大的,然后考虑能不能连一条 \(L\),然后尽量连 \(R\) 中比初始的 \(L\) 最大值小的,最后把剩下的边加进 \(L\) 即可。


P3734

如果没有障碍物的话我们只关心二进制的位数,设 \(f[i][j][k]\) 表示 \(x/y/z\)\(i/j/k\) 位的方案数,转移显然是 \(f[i][j][k]=\sum_{d=0}^{i}f[i-d][j][k]+\sum_{d=0}^{j-1}f[i][j-d][k]+\sum_{d=0}^{k-1}f[i][j][k-d]\)

如果有障碍物的话我们可以考虑容斥,设障碍集合为 \(diff\),答案就是 \(\sum_{s \subseteq diff}(-1)^{|s|}f(s)\)。现在考虑钦定路过 \(s\) 的答案,首先 \(s\) 一定是 \(s_1\subseteq s_2\subseteq ...\subseteq s_m\) 形态的东西,不然没有贡献,诶那我们可以按照这个顺序 dp 带 \(-1\) 的方案数了,类似于 dag 图路径计数。


CF1476F

我求我了,不要虚构不够优的贪心好不好,恼火了。

(去戾气版)虽然题解只有一篇没有直接声称设计状态为前 \(i\) 个灯最大完全覆盖前缀,并且这个状态非常的符合直觉,但是这样子直接声称或许遗漏了某些必要的思考步骤,也完整跳过了这道题目的精髓,不管怎么说声称之后只剩下一个普及组 dp。

这里尝试给出一些更加自然的思考角度,比较机械的,首先如果不按照某种顺序依次电灯,未来就很难去重,不妨先试试按照灯的顺序去考虑位置。点亮前 \(i\) 盏灯,之后我们关心一个二元组 \((i,j)\),表示最左边的还没有点亮的灯是 \(l\),向右一直覆盖到 \(r\),考虑加入 \(i\) 会产生的变化:

  • 向左走,\((i,j)\to (0,j)/(i,j)\),条件是 \(x-p_x\leq i\)
  • 向右走,\((i,j)\to (i,x+p_x)/(i,j)\),条件是 \(x+p_x>j\)

\((0,j)\) 的特殊状态要求我们维护点亮前 \(i\) 盏灯能完整覆盖的最大前缀,剩下的二元组只有第二维会变化,所以不妨对所有的 \(i\) 维护 \(\max\{j\}\),就是区间取 \(\max\) 了,剩下的都是分类讨论。但是进一步的,这些转移中,一个二元组出生起 \(i\) 就定死了直到碰到一个向左走的覆盖,意思是 \(j\) 其实是可以用区间 rmq 更新的,你只要从刚诞生的 \((i,j)\) 转移,一方面这个东西合法性肯定是先不行、再行的、答案也是单调的,你可以二分那个位置,另一方面刚诞生的 \((i,j)\) 等价于 \(i-1\) 灯前缀能覆盖出的最大前缀长度,因为这边肯定没有向后覆盖的边了大哥哥,不然就不是最大前缀长度了。所以设 \(f_i\) 表示点亮前 \(i\) 盏灯的最大完全覆盖前缀,分类讨论新灯往左还是往右,因为 \(f\) 单调写个二分 dp 上去。

或者你不想这么机械,你先考虑最终的情况是什么样的,若干相交、不包含、完全覆盖的区间,贡献可能来自区间左一个点、或者右一个点,你考虑去拆一个 dp 顺序,还是跟上文所述的那样按照 \(i\) 的顺序拆,拆除来的过程就跟题目的 dp 一致了哦。

posted @ 2025-11-03 15:48  Hypoxia571  阅读(1)  评论(0)    收藏  举报