CF912C Perun, Ult!

题目描述

许多学生都会高效地度过寒假,Vlad 就是其中的佼佼者!这已经是他连续三天,在靠着新年剩下的沙拉和橘子的动力下,校准他在最喜欢的 MOBA 游戏中的积分了,他使用的英雄名叫 Perun。 Perun 拥有一个终极技能叫作“雷霆震怒”。该技能在施放瞬间,会对地图上所有敌人(总共有 $n$ 个)造成 $d$ 点伤害(一次性效果)。技能的施放存在限制:只能在整数秒(即时间为整数的时刻)才能施放。击杀敌人初始获得的赏金为 $A$。此外,赏金每过 1 秒会增加 $B$。严格来说,若在第 $t$ 秒施放技能,并且第 $i$ 个敌人因此被击杀(即其生命值降为 $0$ 或以下),则 Vlad 可以获得 $A + t \cdot B$ 单位的金币。 每个敌人都会受到伤害,也可能被治愈。虽然造成这些变化的方式有多种,但 Vlad 对具体过程并不关心。对于每个敌人,他已知以下信息: - $h_i$ — 第 $i$ 个敌人的最大生命值; - $a_i$ — 第 $i$ 个敌人在第 $0$ 秒的初始生命值; - $r_i$ — 第 $i$ 个敌人每秒可以恢复的生命值; 此外,Vlad 还知道 $m$ 个敌人的生命值变更事件: - $t_j$ — 第 $j$ 条事件发生的时间; - $e_j$ — 生命值被变更的敌人编号; - $u_j$ — 第 $j$ 条事件后,$enemy_j$ 的生命值变为 $u_j$。 显然,Vlad 希望获得尽可能多的金币。如果有必要,他甚至可以等待很多年,只为在最佳时机施放技能。请帮助他确定应该在哪一个(从 $0$ 开始,包含 $0$,到 $+\infty$ 的整数秒)时刻施放该技能,使得一次技能释放能获得最大的金币数,并输出这个最大金币数。 如果 Vlad 可以获得无限的金币(即最佳金币数可以为无穷大),输出 $-1$。

输入格式

第一行输入两个整数 $n$ 和 $m$($1 \leq n \leq 10^5$,$0 \leq m \leq 10^5$)。 第二行输入三个整数:$A$,$B$ 和 $d$($1 \leq A, d \leq 10^9$,$0 \leq B \leq 10^9$)。 接下来 $n$ 行,每行三个整数,表示 $h_i$、$a_i$、$r_i$($1 \leq h_i, a_i \leq 10^9$,$0 \leq r_i \leq 10^6$)。 接下来的 $m$ 行,每行三个整数 $t_j$、$e_j$、$u_j$($1 \leq t_j \leq 10^9$,$1 \leq e_j \leq n$,$1 \leq u_j \leq h_{e_j}$)。 保证对于每个敌人同一秒最多只有一个事件:即对于所有 $1 \leq a, b \leq m, a\neq b$ ,若 $t_a = t_b$,则 $e_a \neq e_b$。

输出格式

输出单个整数:如果 Vlad 能通过一次“雷霆震怒”获得的最大金币有限,则输出最大金币数,否则输出 $-1$ 表示能够获得无限金币。

说明/提示

下图展示了样例中每个敌人的生命值随时间的变化。 黄色区域表示 Vlad 可以击杀一个敌人的时间段。 紫色区域表示 Vlad 可以击杀两个敌人的时间段。 在第一个样例中,Vlad 可以在第 $50$ 秒施放技能,这时敌人 $2$ 和 $3$ 都会死亡,他们的生命值分别为 $40$ 和 $50$。Vlad 将获得 $2 \cdot (1000+50\cdot10) = 3000$ 金币。 在第二个样例中,第一个敌人的最大生命值比技能伤害还低,因此该敌人可以在任意时刻被击杀。由于赏金每秒增加 $50$,理论上可以获得无限金币,因此输出 $-1$。 由 ChatGPT 5 翻译