CF1704

vp 拿到了 rk5500+ 的成绩,不愧是我。

以后的总结里我认为比较有意义的题会标 \(!\),难题标 \(*\)

C(贪心)

开始读错题了以为是序列,后来发现是个环。。假设 \(i\)\((i\bmod m)+1\) 之间的长度是 \(L_i\),可以发现每次取最长的最优,直接做就好了。

\(!\)D

神秘题。算是对数列下标的一个观察。

考虑寻找一个不变量,而在值域上观察没有什么好的结果。考虑操作 \((i,j)\to(i-1,j+1)\)\((i,j)\to (i-1,j+2)\) 的区别,发现后面下标的和是 \(i+j+1\),前面则不变。所以假如我们把每个“1”看做球,数组位置看做盒子,假如对每个球所处的盒子编号求和那么前面和不变后面和恰好 \(+1\)。之后就不难做了。

E(DP)

全部都非 \(0\) 很好做。引入 \(f_i\) 表示 \(i\) 归零的时间,那么有转移 \(f_v=a_v+\sum_{(u,v)\in E} f_u\)。如果有 \(0\) 那么就模拟一下使得所有可能非 \(0\) 的位置非 \(0\)。这个过程最多 \(O(n)\) 步,可以直接模拟。

\(!\)F(博弈、SG 函数)

开始以为不能碰白格子懵逼了好久。

两边的策略显然是先抢对方的再碰自己的。如果 R,B 数量不相等就做完了。如果 RB 数量相等,那么第一个拿不到 RB 的人就输了。此时游戏变成了一个公平组合游戏,可以引入 SG 函数来处理。把形如 RBRBRBR 的子区间提取出来,那么当前局面的 SG 值就是它们的异或和。对于单个子区间,答案只和它的长度有关。引入 \(f_n\) 表示长度为 \(n\) 的 SG 值,它的所有后继局面是 \(\forall i\in [0,n-2],[i]\times[n-i-2]\)(此处用 \(\times\) 表示游戏的组合),DP 可以 \(O(n^2)\) 求出 \(f\)。把 \(f\) 打个表发现有个长度为 \(34\) 的循环节。这样就可以 \(O(n)\) 做了。

找循环节可以善用 Ctrl+F。

\(*\)G(字符串匹配、构造)

想了两天后放弃的题。

先考虑枚举起点 \(i\) 然后判断,如果把 \(a_i\)\(a_{i+1}\) 放在一起观察,就可以发现 \(b_j-a_i+b_{j+1}-a_{i+1}\) 恰好为 \(\sum_{j=1}^{i+1} [j\in S](-1)^{j-i+1}\)。如果把相邻两项做差,可以发现它代表的就是 \(i+2\) 是否放置,这个值是在 \([0,1]\) 之间的。

定义 \(c_i\) 表示 \(a_{i-2}+2a_{i-1}+a_i\)\(d_i\)\(b_{i-2}+2b_{i-1}+b_i\),那么一个必要条件是 \(\forall j\in[i+2,i+m-1],d_{j-i+1}-c_j\in[0,1]\)。这像极了一个字符串匹配问题,可以用 FFT 做到 \(O(n\log n)\) 或者用 bitset 做到 \(O(n^2/w)\)

上面的考虑实际上忽略了 \(a_i\)\(a_{i+1}\) 的处理。我们需要 \(i+1\) 以前操作对 \(a_i\) 操作的和为 \(b_1-a_i\),并且奇偶个数差为 \(b_1+b_2-a_i-a_{i+1}\)。这个问题相当于在 \(\{0,2,4,\cdots\},\{1,3,5,\cdots\}\) 中各自选 \(a,b\) 个数使得 \(b-a=x\) 且差为 \(y\)。可以先钦定选所有偶数,然后问题就相当于在 \([1,i+1]\) 中选 \(p\) 个数使得和为 \(q\)。连续非负整数中选数的一个结论是若所有能表示出来的数是连续的,那么只要求最小值和最大值即可。构造的话只需要从大往小选,如果不选会使得后面不合法就选。到这里就做完了。

一些反思:虽然考虑 \(i\)\(i+1\) 对应的两个相关限制很精妙,但事实上如果把选与不选看做 \(0/1\),那么条件相当于一个方程组。做一下消元就可以立即得到上面结论。还有这个选数问题先钦定竟然没想到,枯了。

一些补充:用 FFT 做字符串匹配的过程是把匹配的条件转化成一个代数式,并使他为 \(0\)。比如这里就是 \((d_i-c_j)(d_i-c_{j}-1)=0\)。然后条件的逻辑与相当于求和后也为 \(0\),这可以用 FFT 求出来。用 bitset 实际上就是考虑字符 \(d_j\) 能与哪些位置匹配,然后对所有 \(d_j\) 对应的位置取交就是答案。不能直接上 KMP 的原因是真实的 border 可能比传统意义上的 border 要长,因为匹配并不一定完全相等。

\(!\)H1

上面那个 G 已经消耗掉了我改 H 的欲望,所以咕了

还是来补下 H1。一开始被题目的奇怪操作折磨了好久,然后才意识到可以建图。建出图来被 \(p_i\) 干扰了好久还是不会做。。

考虑固定 \(b\) 计数 \(a\),那么 \(b\)\(a\) 的一个显然的限制是:\(b_i\neq i,a_{b_i}=i\)。尝试在抽象的模型上讨论问题。把这个限制建个图可以发现合法的图为若干条链,并且这样的链集合和原来的 \(b\) 是一一对应的。那么继续考虑什么样的 \(a\) 能构造出链。这个问题等价于考虑链的顶端和孤立点怎么填。链的顶端是任意填的,单点不能填链尾因为我们不能通过操作 \(p\) 来让后面的点覆盖这个单点的操作。上面就是一个充要条件了。那么可以枚举单点和链的个数。答案为:

\[\sum_i\sum_j\binom{n}{i}(n-i-j)^i(n-i)!\binom{n-i-j-1}{j-1}\frac{1}{j!}(n-1)^j \]

\(i\) 是单点个数,\(j\) 是链的个数。意思是先把 \(i\) 个点分开并标号,然后把点看成球,链看成盒子塞进去。最后由于盒子是没区别的所以除个 \(j!\) 即可。

看到这种奇怪的题多建图,多分离无关条件,还有不要看到啥都想 DP。

posted @ 2022-08-05 18:39  yllcm  阅读(51)  评论(0)    收藏  举报