题意简述
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]$ 区间内。
这个可以拿树状数组求。