AtCoder Beginner Contest 249(A~F)
ABC249A Jogging
数据范围很小,依照题意模拟即可。AC Code
ABC249B Perfect String
依照题意模拟即可。AC Code
ABC249C Just K
注意到 \(n\le 15\),直接 \(O(n2^n)\) 爆搜即可。AC Code
ABC249D Index Trio
\(O(n\log n)\) 预处理一下约数集合,枚举 \(A_i\) 同时枚举约数即可。\(O(nd(n))\)。
容易利用调和级数做到 \(O(n\log n)\)。场上写的是 \(O(nd(n))\) 的做法。AC Code
ABC249E RLE
考虑 dp:设 \(F(i,j)\) 为长度为 \(i\) 的字符串,缩完之后长度变为 \(j\) 的方案数。
枚举最后一段到哪里,得到转移方程:
其中 \(\text{Lg}(x)\) 表示 \(x\) 在十进制下的位数。
考虑枚举 \(\text{Lg}(k)\) 的值,得到:
发现可以用前缀和优化,因此求出 \(F(\cdot,j)\) 的前缀和即可。复杂度 \(O(n^2\lg n)\)。
等等,貌似还少了什么:我们需要最后一段的字母和上一段的字母不一样。
因此似乎需要记录一个 \(F(i,j,S)\),表示最后一段的字母为 \(S\) 的方案数,复杂度还需要 \(\times 26\)?
其实没有必要。可以发现对每个 \(S\),由于它们是对称的,所以 \(F(i,j,S)\) 都是相等的。
转移的时候需要上一个字母与这个不相等,那么只需要乘上 \(25\) 就可以了。
注意当 \(j-x-1=0\),即上一段为空的时候,这个字母选什么都可以,所以此时乘的实际上是 \(26\)。
ABC249F Ignore Operations
这题比 E 水多了。。。
可以发现,如果有一个覆盖操作没有被我们 ignore,那么它前面的所有操作都是白干。
因此考虑枚举最后一个没有被覆盖的操作是哪个,若其后面有 \(x\) 个覆盖操作,那么显然你需要先 ignore \(x\) 次把后面的这些覆盖操作干掉。
现在还剩 \(k-x\) 次 ignore 的机会,考虑后面的加法操作,显然应该从满足 \(y_i<0\) 的 \(y_i\) 中选出前 \(k-x\) 小的。如果这些数的个数不到 \(k-x\) 那就直接全选。
现在只需要维护一个数据结构,支持:
- 插入一个数
- 查询全局前 \(k\) 小的和。
平衡树/权值线段树都是可以的,这里我写了权值线段树。AC Code