在 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 非降。
输出
输出一行一个整数表示毁灭者一共吸收了多少法力。
#include<iostream>
using namespace std;
class Magic_Unit
{
private:
int m_s;//当前法力
int m_m;//最大法力上限
int m_r;//每秒中法力回复速度
static int Destroyer_Magic;//毁灭者魔法值
static int Time;//时间
public:
Magic_Unit() :m_s(0), m_m(0), m_r(0)
{ }
void Init(int s, int m, int r)
{
m_s = s;
m_m = m;
m_r = r;
}
void Mana_Growth(int time);//计算当前魔法单位time时刻的法力值
void Absorb_Mana();//对当前魔法单位进行魔法吸收
static void Update_Time(int time)//更新时间
{
Time = time;
}
static int Return_Destroyer()
{
return Destroyer_Magic;
}
};
int Magic_Unit::Destroyer_Magic = 0;
int Magic_Unit::Time = 0;
void Magic_Unit::Mana_Growth(int time)
{
int temp_Mana = m_r * (time - Time);
m_s += temp_Mana;
if (m_s > m_m)
m_s = m_m;
}
void Magic_Unit::Absorb_Mana()
{
Destroyer_Magic += this->m_s;
this->m_s = 0;
}
int main()
{
int n = 0, si = 0, mi = 0, ri = 0, m = 0, t = 0, l = 0, r = 0;
cin >> n;//输入魔法单位的数目
Magic_Unit* M = new Magic_Unit[n];
for (int i = 0;i < n;i++)
{
cin >> si >> mi >> ri;//依次输入初始法力、最大法力上限、每秒中法力回复速度
M[i].Init(si, mi, ri);
}
cin >> m;//输入操作数
for (int i = 0;i < m;i++)
{
cin >> t >> l >> r;//表示时刻 t,毁灭者对所有编号从 l 到 r 的单位
for (int j = 0;j < n;j++)
{
M[j].Mana_Growth(t);
if (j >= l - 1 && j < r)
M[j].Absorb_Mana();
}
Magic_Unit::Update_Time(t);
}
cout << Magic_Unit::Return_Destroyer() << endl;
}