2024.8.25 test
A
你要求有多少个长度为 \(n\) 的排列 \(p\) 满足 \(mex(p_1,p_2,...p_i)=a_i\)。\(n\le 1e5\)。
可以看出 \(a_i\) 如果有变化,如 \(a_i=c,a_{i+1}\neq a_i\),那么 \(p_{i+1}=c\)。
那么我们把没有确定的数填进去,从小到大填,能填的位置是一个前缀,长度递增。
那么设当前能填的位置个数为 \(x\),之前填了 \(cnt\) 个,把 \(x-cnt\) 乘起来即可。
B
有一个字符串 \(s\),你每次要复制 \(s_i\) 到 \(t\) 里面,你的操作是先选中 \(s_i\),按 ctrl+C,再 ctrl+V。
然而 ctrl+C,ctrl+V 的概率是 50%。一开始剪贴板为空。问 \(t\) 含有字符全部相同的子串个数的期望。
同时有 \(q\) 次询问,每次更改 \(s\) 中的一个位置,再问答案,\(n,q\le 2e5\)。
首先考虑拆贡献。对于每个字符算贡献,变成 01 形式。
要不然状态里需要存当前是什么字符,后面套上 ddp 矩阵太大。
继续拆贡献,我们对于每个子串 \([l,r]\) 都算其出现概率并算上贡献。
有五种状态:\(l,r\) 都未钦定,当前是/不是 \(c\);
\(l\) 已被钦定,\(r\) 未钦定,当前是/不是 \(c\);\(l,r\) 都被钦定。
ddp 即可,这个题充分运用了拆贡献。
我把这种拆 \(l,r\) 的方法理解为如 alexwei 所说的,对每一个“空隙”计算贡献。