CF121E 树状数组 预处理

只能说数据强度低下。

给定数组 \(A\),进行以下两个操作:

  • add\(\forall i \in [l, r], A_i \gets A_i + d\)

  • count:输出 \(l \sim r\) 中仅由 \(4, 7\) 两个数字构成的数(幸运数)有几个。

看到题一眼 seg。但是因为未知因素,树状数组完全可以胜任这个任务。

add 操作、count 操作都是树状数组的基本,除了单点查询变成了区间查询,这里不详细说明。

这里补充一下判断是否是幸运数的方法。由于数据只有 \(10^4\),可以简单 dfs 一下。用 \(f_x\) 来存储 \(x\) 是否是幸运数(\(0\)\(1\))。

步骤:

  1. 判断是否 \(> 10^4\) 就要退出;
  2. \(f_x \gets 1\)
  3. 递归 dfs,传参 \(10x + 4\)(也就是这个数尾部添加了一个 \(4\));
  4. 递归 dfs,传参 \(10x + 7\)(同理,添加 \(7\))。

在最开始,预执行 dfs \(4\)\(7\)。因为小范围,应该只要执行 \(2^4 + 2^3 + 2^2 + 2^1 = 2^5 - 2 = 30\) 次。

最后为了表示对题 E 的尊重,还是补一长串火车头卡卡常。代码

posted @ 2023-12-25 21:01  Carrot-Meow~  阅读(18)  评论(0)    收藏  举报