标签:
在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位。
毁灭者的核心技能之一,叫做魔法吸收(Absorb Mana):
现在让我们来考虑下面的问题:
假设你拥有 n 个魔法单位,他们从左到有站在一行,编号从 1 到 n。 每个单位拥有三项属性:
si: 初始法力。
mi: 最大法力上限。
ri: 每秒中法力回复速度。
现在你操纵一个毁灭者,有 m 个操作,t l r,表示时刻 t,毁灭者对所有编号从 l 到 r 的单位,使用了魔法吸收。操作按照时间顺序给出,计算毁灭者一共吸收了多少法力。
输入数据的第一行有一个整数 n(1 ≤ n ≤105) — 你的魔法单位的数目。
接下来的 n 行,每行有三个整数 si, mi, ri(0 ≤ si ≤ mi ≤ 105, 0 ≤ ri ≤ 105) 描述一个魔法单位。
接下来一行又一个整数 m(1 ≤ m ≤ 105), — 操作的数目。
接下来的 m 行,每行描述一个操作 t, l, r(0 ≤ t ≤ 109, 1 ≤ l ≤ r ≤ n),t 非降。
输出一行一个整数表示毁灭者一共吸收了多少法力。
5 0 10 1 0 12 1 0 20 1 0 12 1 0 10 1 2 5 1 5 19 1 5
83
Solution:
如果魔法单位没有法力上限,这道题就是一道水题了,线段树即可搞定。
设置了法力上限,从维护区间角度来考虑就比较困难了。
我们换一种思路,考虑对每一个魔法单位维护其遭遇收割的各个时刻,或者说其遭遇收割的时间序列。
这样就可以轻松求出毁灭者在各个魔法单位收割的法力值,做法如下:
为简单计,先假设所有魔法单位的初始法力都为零。
设魔法单位$i$法力回满所需时间为$T$,显然$T=\lceil \frac{m_i}{r_i}\rceil$。
考察相邻收割时刻$t_k$与$t_{k+1}$,其间隔记做$\Delta t=t_{k+1}-t_{k}$,若$\Delta t<T$ 则$t_{k+1}$时刻收割的法力值为$\Delta t\times r_i$,否则为$m_{i}$。
标签:
原文地址:http://www.cnblogs.com/Patt/p/5426871.html