【A】动态规划

CF1810G The Maximum Prefix

sol1
如果我们只需要求出一个 \(k\),可以倒过来 dp。
转移 \(f_{i,s}\to p_{a_i}\times f_{i-1,\max(0,s+a_i)}\)

再正着 dp,钦定后续的最大值,则转移为 \(p_{a_i}\times f_{i-1,\max(0,s+a_i)} \to f_{i,s}\)。将初值设为 \(f_{0,x}=h_x\) 即可。

sol2
考虑差分,计算 \(s\ge x\) 的概率,乘上 \(h_x-h_{x-1}\)
即求存在 \(s_i=x\) 的概率。
考虑容斥,设一个集合 \(P\) 满足 \(s_i=x\),他的容斥系数为 \((-1)^{|P|+1}\)
那么每次我们经过 \(s_i=x\),第一次的权值为 \(h_x-h_{x-1}\),后面的权值为 \(-1\)
于是只关心第一次经过钦定的位置的高度,后面就是相对高度达到 0。
\(\color{Red}\mathtt ?\)

AT_agc061_c [AGC061C] First Come First Serve

考虑一个情况下 \(a_i,b_i\) 的选择没有区别:设与 \(i\) 有交集的区间是 \([a_{l},b_{l}],[a_{l+1},b_{l+1}],\cdots,[a_r,b_r]\)
那么当 \(l,r\) 的选择都是在 \([a_i,b_i]\) 以外的,那么 \(a_i,b_i\) 就没有区别。

那么对于 \([l,r]\) 我们如果给他钦定了上述情况,则需要减掉这种情况。
dp 的时候减去这种转移即可。

AT_abc290_h [ABC290Ex] Bow Meow Optimization

结论:序列左右都有 \(n/2\) 个狗和 \(m/2\) 个猫,且权值形成单峰数列。中间可能有一个额外的狗或者猫。
可以使用调整法证明。

然后可以拆绝对值,一个简单 dp。
其实贪心放就是对的。

AT_arc134_e [ARC134E] Modulo Nim

  • \(\{1\},\{2\},\{4,8\}\):先手输。
  • \(|S|=1\):先手胜。
  • 存在奇数:先手胜。
  • 都是 2 的倍数:
    • 模 4 意义下存在 2:先手胜。
  • 都是 4 的倍数:
    • 如果模 3 意义下都是 1 或者都是 2:先手胜。
    • 模 12 意义下为 \(\{4,8\}\) 则必胜。
  • 剩下的情况:都是 12 的倍数,数并不多,可以状压求解。

P9338 [JOIST 2023] 合唱 / Chorus

判定一个串是否是好的?考虑每次删除第一个 B 之前的所有 A,删除次数 \(\le k\) 即为好的。
将删除改写为跳跃:设 \(a_i\) 表示第 \(i\) 个 B 之前有 \(a_i\) 个 A,则我们有一个指针 \(p\),初始为 \(1\),每次从 \(p\to a_p+1\),跳到 \(n+1\) 结束。那么跳跃次数即为删除次数。

考虑我们交换一定是交换 BA,否则一定不优。这体现为将某个 \(a_x\) 增加 1。
限制是什么?\(a_i\le a_{i+1}\le n\)。显然最后的 \(a\) 序列满足条件,则一定有一种操作方式得到这个 \(a\) 序列。

考虑 dp。设 \(f_{i,x}\) 表示跳了 \(x\) 次跳到了 \(i\),下次跳到 \(j\)
\(f_{i,x}\to f_{j,x+1}+\sum_{k=i}^{j-1}\max(j-1-a_k,0)\)

\(x\) 这一维有凸性,上 wqs 二分。转移代价改写为 \(o_{j-1}\times (j-1)-s_{j-1}-(i-1)\times (j-1)+pre_{i-1}\)
其中 \(o_i=\sum_{j=1}^n [a_j\le i],s_i=\sum_{j=1}^{n} a_j\times [a_j\le i],pre_i=\sum_{j=1}^i a_j\)

\(f_j={\color{#56bed7}f_i+pre_{i-1}}-(i-1)\times (j-1)+{\color{#ff6666} o_{j-1}\times (j-1)-s_{j-1}+mid}\),斜率优化即可。

P9339 [JOIST 2023] 曲奇 / Cookies

类似 Hall 定理可以写出一个充要条件:

  • \(\sum_{i=1}^k x_i=\sum a_i\)
  • \(\forall p,\sum_{i=1}^p x_i\le \sum \min(a_i,p)\)

然后背包转移做这个东西,发现状态是 \(O(sum^2\log sum)\),然后可以 bitset。

RPSrobots

op: Topcoder 14379

题面:
\(n\) 个剪刀石头布机器人,每个人的决策 \(s_i\) 都是一个长度为 \(k\) 的由 RPS 组成的字符串。
两个机器人比赛的时候:首先将各自的 \(s_i\) 循环位移任意的位数,然后逐位比较。
称两个机器人是稳定的,当且仅当:无论如何循环位移,他们比赛的结果不变。
比赛结果描述为 (win,lose,draw)。
求有多少机器人的非空子集,满足子集内两两机器人对都是稳定的。模 \(10^9+7\)
\(n\le 10^5,k\le 18\)

首先考虑如何判定稳定对?显然只有一个人循环就好了。
如果我们固定了循环后的结果,那么比赛结果我们描述为 \(\sum_{i=1}^k {\omega_3}^{a_i-b_i}\)。这个东西形成了双射。
那么对于不知道循环结果的,我们写出一个多项式 $$[x^d]F(x)=\sum_{i-j\equiv d \pmod k} {\omega_3}^{a_i} {\omega_3}^{-b_j}$$
也就是两个序列进行循环卷积。要求这个多项式每项系数相同。
考虑 fft 本身支持循环卷积。那么求出 fft 点值后,点积,再 ifft 回去。

ifft 本质也是 fft,所以什么时候插回去的系数都相同?即点积结果只有常数有值的情况。
即要求去掉常数项后,两个点值数组无交。
但是两个东西不是对称的,怎么办?发现他们有值的位置是一样的,所以不影响。
然后就可以解决原题目了。
时限开了 1min 瞎写都能过。

posted @ 2025-12-20 08:16  TallBanana  阅读(1)  评论(0)    收藏  举报