0%

CF1997E Level Up

题意简述

Monocarp 正在玩一款电脑游戏,起始时他的等级为 1。他将按顺序与 $n$ 只怪物战斗,第 $i$ 只怪物的等级为 $a_i$。

每只怪物的遭遇顺序如下:

  • 如果 Monocarp 的等级严格高于怪物的等级,怪物逃跑;

  • 否则,Monocarp 与怪物战斗。

每经过 $k$ 次战斗(逃跑的怪物不计算在内),Monocarp 的等级增加 1。所以在战斗了 $k$ 只怪物后他的等级变为 2,战斗了 $2k$ 只怪物后他的等级变为 3,依此类推。

你需要处理 $q$ 个查询,每个查询的形式为:
$i~x$: 如果参数 $k$ 等于 $x$,第 $i$ 只怪物会与 Monocarp 战斗还是逃跑?

思路分析

不太会。

但在洛谷看到 一篇题解 感觉很神秘很厉害。

通过题目容易知道,$k$ 越小,升级越快,逃跑的怪物会越多。

对于每一只怪物,都存在一个最大的 $k_i$,当 $k \leq k_i$ 时,怪物必定会逃跑。

那么这个 $k_i$ 就可以通过二分答案找出来。

然后考虑怎么 $\text{check}$。

对于第 $i$ 只怪物前面的 $i-1$ 只怪物,我们已经知道了它们对应的 $k_j$。

那么第 $i$ 只怪物时经历过的战斗数即为 $\sum\limits_{j=1}^{i-1} [k_j \leq k_i]$ 。

换言之,战斗数即为前 $i-1$ 个 $k_j$ 中小于 $k_i$ 的个数。

再换言之,以上可以视为求前 $i-1$ 个 $k_j$,有多少个落在了 $[1,k_i-1]$ 区间内。

这个可以拿树状数组求。

提交记录