QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 512 MB Total points: 100
Statistics

题目描述

在过去的假期中,很不幸,你沉迷于某款致理书院全新自研回合制热血战斗游戏中无法自拔。

现在你计划挑战游戏中的一个副本。可是想进入这个副本,需要消耗十分珍贵的资源,于是你希望做好准备再前往挑战。为此,你打算自己写一个模拟器,来预测战斗情况。

于是,你首先搞明白了游戏的机制(注意阅读题面时如有不懂,可以暂且跳过,有可能后文会有解释):

游戏机制:基本数值

游戏中,一个技能具有3种属性:基础伤害、韧性破坏力、耗蓝量。均为整数。

每个英雄,有9种属性:攻击力、防御力、血量、韧性、持续伤害威力、蓝条最大值、蓝条恢复量、速度、编号。均为整数。

每个英雄拥有若干技能,数量不一。

每个英雄会处于三种状态:

  1. 血量小于等于0,我们就称它进入死亡状态,不会再开展任何行动;
  2. 血量大于0且韧性小于等于0,我们就称它进入流血状态,会在判定阶段(后文解释)受到攻击;
  3. 否则,我们称它处于正常状态。

游戏机制:技能

技能一定是某一个攻击者A对某一个被攻击者B释放,会立即导致:

  1. B的血量下降 (基础伤害*A攻击力/B防御力)下取整
  2. B的韧性下降 韧性破坏力
  3. A的蓝条下降 耗蓝量

游戏机制:对战

游戏中的对战为玩家控制若干英雄与系统控制若干英雄开展正义的群架。

游戏会进行若干轮,直到以下两者至少满足其一:

  1. 胜负判断:某方没有不处于死亡状态的英雄 ;
  2. 超时判断:第 $R_{max}$ 轮结束 。

每一轮中,双方所有尚未进入死亡状态的英雄,按照速度从大到小依次行动(速度相同则编号小的先行动,保证编号互不相同),轮到英雄A行动时,他会依次进行如下阶段:

  1. 判定阶段。如果当前自身处于流血状态,立即遭受一次技能攻击:记第一次使自己韧性小于等于0的英雄为B,该技能视为由B发出,基础伤害为B的持续伤害威力,消耗韧性力为0,耗蓝量为0。(注意这里是“视为”,也就是说哪怕英雄B已进入死亡状态,英雄A仍会受到攻击。)
  2. 回复阶段。自身蓝量回复蓝条恢复量点,若恢复后超过蓝条最大值,则蓝量强行变更为蓝条最大值
  3. 攻击阶段。自行选择一个耗蓝量不超过自身当前蓝量的技能,对一个自行选择的对方英雄释放。没有符合要求的技能,则跳过该阶段。(自行选择的具体机制见“释放攻击原则”)

任何英雄在任何时刻,一旦血量小于等于0,就会立马进入死亡状态,立即结束行动(比如,在判定阶段死亡,就不会再进行接下来的回复和攻击阶段了)

胜负判断会在英雄行动结束后进行。

释放攻击原则

你发现对手自动战斗的规则很简单:

  1. 技能选择:会选择一个可以释放的,耗蓝量最大的技能(多个耗蓝量相同,则选基础攻击力尽可能高的。若多个基础攻击力仍相同,则选择韧性破坏力尽可能高的)。

  2. 攻击目标选择:

    • 若对方仍有正常状态的英雄,则在其中选一个血量最低的;

    • 若对方没有正常状态的英雄,则选对方流血的英雄中血量最低的。

    • 可以保证不会在需要选择攻击目标时,对方英雄全部死亡。

    如果有多个满足要求的对象,优先选择编号更小的

你决定自己也使用这套自动战斗系统。

现在你获得了对方所有英雄的所有数值,也安排好了自己的阵容,希望知道对战结束时,每个英雄的血量(注意可能有负数血量)。

初始时每个英雄的蓝量均为其蓝条最大值

输入格式

从标准输入读入数据。

第一行三个非负整数 $n, m, R_{max}$ ,分别表示自己的英雄数量、对方的英雄数量与最大轮数。

接下来 $n+m$ 组数据,每组表示一个英雄。前 $n$ 组表示自己的英雄,后 $m$ 组表示对方的英雄。

每组数据由若干行组成,第一行 $10$ 个正整数,分别表示该英雄的攻击力、防御力、血量、韧性、持续伤害威力、蓝条最大值、蓝条恢复量、速度、编号与技能数。

接下来 技能数 行,每行 $3$ 个正整数,分别表示该技能的基础伤害、韧性破坏力、耗蓝量。

输出格式

输出到标准输出。

共 $n+m$ 行。第 $i$ 行一个整数,表示输入的第 $i$ 个英雄在对战结束时的血量。

样例

输入

2 1 3
1 1 3 4 5 6 7 8 1 1
1 0 0
1 1 4 4 5 6 7 8 2 1
1 0 0
1 1 5 4 5 6 7 8 3 1
1 0 0

输出

1
4
0

解释

以下以编号称呼英雄:

第一轮:

  1. Hero1的回合:
    • 判定阶段:未进入流血状态,不受伤害。
    • 回复阶段:Hero1.蓝量 变化 6->6
    • 攻击阶段:选中Hero3,自身第一个技能。
      • Hero1.蓝量 变化 6->6(耗蓝量为0)
      • Hero3.血量 变化 5->4
      • Hero3.韧性 变化 4->4
  2. (接下来的回合只叙述发生变化的数值)Hero2的回合:Hero2攻击了Hero3,Hero3.血量 变化 4->3
  3. Hero3的回合:Hero3攻击了Hero1,Hero1.血量 变化 3->2

第二轮:

  1. Hero1攻击了Hero3,Hero3.血量 变化 3->2
  2. Hero2攻击了Hero3,Hero3.血量 变化 2->1
  3. Hero3攻击了Hero1,Hero1.血量 变化 2->1

第三轮:

  1. Hero1攻击了Hero3,Hero3.血量 变化 1->0。Hero3进入死亡状态。

此时对方没有不处于死亡状态的英雄,游戏结束

此时血量分别是1, 4, 0。

样例二

见下载目录下的 ex_2.inex_2.ans

样例三

见下载目录下的 ex_3.inex_3.ans

子任务

对于所有数据,保证 $1\leq n\leq 10^{2}, 1\leq m\leq 10^{2},1\leq R_{max}\leq 10^{4}$ 。保证单个英雄技能数不超过 $10$。保证输入数字均在 $[0,2^{31}-1]\cap\mathbb{Z}$ 范围内。

子任务分值$n$$m$$R_{max}$特殊性质
$5$$\le 10^{2}$$\le 10^{2}$$\le 0$
$10$$\le 1$$\le 1$$\le 10^{4}$A
$25$
$15$$\le 10^{2}$$\le 10^{2}$A
B
$30$

特殊性质A: 每个英雄只有一个技能。 特殊性质B: 技能韧性破坏力均为0,也就是说不会有英雄陷入流血状态。

提示

本题正常模拟实现功能即可通过,但是请不要使用过于低效的方法。

本题为IOI赛制,您可以先写了提交,如若不通过再考虑corner case。

注意运算过程中是否会超出int范围。

如果觉得本题过于麻烦,可以先看看后面的题。