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\) 的方案数。

枚举最后一段到哪里,得到转移方程:

\[F(i,j)=\sum_{0<k\le i}F(i-k,j-\text{Lg}(k)-1) \]

其中 \(\text{Lg}(x)\) 表示 \(x\) 在十进制下的位数。

考虑枚举 \(\text{Lg}(k)\) 的值,得到:

\[\sum_{0<k\le i}F(i-k,j-\text{Lg}(k)-1)=\sum_{x=1}^{\text{Lg}(i)}\sum_{k=10^{x-1}}^{\min(i,10^x-1)}F(i-k,j-x-1) \]

发现可以用前缀和优化,因此求出 \(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\)

AC Code

ABC249F Ignore Operations

这题比 E 水多了。。。

可以发现,如果有一个覆盖操作没有被我们 ignore,那么它前面的所有操作都是白干。

因此考虑枚举最后一个没有被覆盖的操作是哪个,若其后面有 \(x\) 个覆盖操作,那么显然你需要先 ignore \(x\) 次把后面的这些覆盖操作干掉。

现在还剩 \(k-x\) 次 ignore 的机会,考虑后面的加法操作,显然应该从满足 \(y_i<0\)\(y_i\) 中选出前 \(k-x\) 小的。如果这些数的个数不到 \(k-x\) 那就直接全选。

现在只需要维护一个数据结构,支持:

  • 插入一个数
  • 查询全局前 \(k\) 小的和。

平衡树/权值线段树都是可以的,这里我写了权值线段树。AC Code

posted @ 2022-04-25 08:37  云浅知处  阅读(251)  评论(0编辑  收藏  举报