模拟60—「整除·糖果·打字机· 堆」
整除
考场上直接质因数分解大样例发现可以拆成各个因子的贡献分别算。
但是没注意带 \(log\) 复杂度不对,所以线性筛一下幂就好了。
能拆开的原因是每存在一个合法的 \(x\in[1,n]\) , 他必定会导致 \(c\) 个模数中存在一个合法的 \(t\in[1,p_i]\) 。
又因为 \(CRT\) 保证了如果能找到一套余数,那么在 \([1,n]\) 必定有唯一解,所以可以直接乘起来。
糖果
这个题基础 \(dp\) 很简单 ,直接考虑多重排列长啥样就可以推出来。
然后发现不同的 \(a_i\) 有不同的上下界,并且结果和我们处理每个 \(a_i\) 的顺序无关。
所以可以考虑把相同的 \(a_i\) 一起处理,并且发现所有 \(\geq m\) 的 \(a_i\) 都是等价的。
所以每个\(a_i\) 分别做,因为转移相同,所以矩阵快速幂优化一下就好了。
打字机
神仙 \(dp\) 。
首先 \(40pts\) 的做法不难,可以设计 \(f_{i,j}\) 代表 \(S\) 中处理到 \(i\) , \(T\) 中处理到 \(j\) 的时候最小操作次数。
这个做法是 \(O(|S||T|)\) 的。
然后考虑把他改造成正解,如果可以 \(O(|T|^2)\)计算,那我们就可以每个左端点做一次了。
观察性质来缩小我们的状态数,会发现 \(f_{i,j}\) 很大,但是 \(i-f_{i,j}\) 不是很大。
所以我们考虑转化状态定义,初始假设我们 “删除” 掉了所有的字符,所以我们初始的答案是 \(R-L+1\) 。
然后考虑让额外的操作数更少(可以是负数)。
分别考虑其他操作,为了满足 \(T\) 中的每一位,有三种方式 :插入,替换,用原来的。
如果插入,就相当与先删在插,所以额外操作加一。
如果替换,就相当于替换而不是删除,所以额外操作不加。
如果用原来的,就相当于不删除,所以额外操作减一。
所以先考虑列一下基础 \(dp\) , 设计 \(f_{i,j}\) 代表 \(S\) 中处理到 \(i\) , \(T\) 中处理到 \(j\) 的时候最小额外操作次数。
\(f_{i,j} +1\rightarrow f_{i,j+1}\) 代表插入
\(f_{i,j} \rightarrow f_{i+1,j+1}\) 代表替换
\(f_{i,j} -1\rightarrow f_{nxt_{i,j},j+1}\) 代表用原来的, \(nxt\) 意义就是第一个能匹配的相同字符。
应为这个 \(dp\) 的值域不大,所以考虑把值域和第一维互换位置,即
\(g_{i,j}\) 代表\(T\) 中处理到 \(i\) 的时候, 最小额外操作次数为 \(j\) 是在 \(S\) 中 最少需要到哪 。
转移捣一下就行了,每个左端点做一遍,最后看哪些满足\(\leq r\) ,去一个最小的 \(j\) 就好了。
调换值域和定义域减少状态数,我在\(LYK \ love \ painting\) 也用到了。
堆
神仙计数 , 待改。
总结
T1 属实失误,以为自己的算法对了复杂度都没算,太大意了,但凡知道复杂度不对一个线性筛就解决了。
T2 循环节再次找炸,细节处理一定要注意。
T3,T4 有50pts(甚至70pts)暴力分没打,感觉还是前两题做的时间太长了,还需要历练。

浙公网安备 33010602011771号