#P1043. 游戏世界

    ID: 55 传统题 1000ms 256MiB 尝试: 3 已通过: 0通过率: 0%难度: 普及 ← 上一题 下一题 → 随机一题 上传者: 标签 模拟 数学 枚举 组合数学 差分 大模拟 排序
显示设置

游戏世界

题目描述

这个游戏里有 nn 个玩家,每个玩家都有以下个人数据:

  • name:角色名称,字符串;
  • level:等级,初始为 11;
  • maxhp:生命值上限;
  • hp:当前生命值,初始等于生命值上限;
  • xp:经验值;
  • atk:攻击力;
  • def:防御力;
  • zy:职业编号。

升级规则

  • 从 LL 级升到 L+1L+1 级需要 L×nL \times n 点经验,其中 nn 为玩家人数。
  • 只要经验足够,就会连续升级;每次升级扣除对应的经验,并永久获得该职业的升级加成。
  • 每次升级后,当前生命值会立刻补满为生命值上限。

职业与加成

职业编号 zy 职业 初始攻击力 初始防御力 每升一级的加成
11 战士 55 攻击力、防御力、生命值上限各 +min⁡(k,r)+1+\min(k,r)+1
22 刺客 99 11 攻击力 +max⁡(k,r)+\max(k,r),防御力、生命值上限各 +min⁡(k,r)+\min(k,r)
33 肉盾 11 99 攻击力、生命值上限各 +min⁡(k,r)+\min(k,r),防御力 +max⁡(k,r)+\max(k,r)
44 法师 44 33 攻击力、防御力、生命值上限各 +min⁡(k,r)−1+\min(k,r)-1

其中 k,rk, r 是输入给出的两个整数。

法师的附加属性:法师的普通攻击造成 dd 点伤害后,会在接下来的 nn 个回合内,每个回合开始时对敌人额外造成 ⌊d×10%⌋\lfloor d \times 10\% \rfloor 点穿透伤害(无视防御)。由于法师每个回合都会攻击,该效果会被不断刷新并延长。

指令

已知有 qq 次操作,每次操作是下列五种之一:

  • 1 x y:把编号为 xx 的玩家的经验值增加 yy;若该玩家已淘汰则跳过。
  • 2 x:把所有玩家的经验值增加 xx。
  • 3 x y tf:编号为 xx 的玩家向编号为 yy 的玩家发起战斗申请。
  • 如果场上只剩下 11 名玩家,或者 xx 或 yy 已经被淘汰,或者 x=yx=y,则跳过这次操作;
  • 如果 tf=0tf=0,表示对方拒绝了申请,跳过这次操作;
  • 如果 tf=1tf=1,表示对方接受了申请,开始战斗,规则如下:
  • 战斗按回合进行,每个回合由 xx 先出手攻击 yy;若 yy 尚未被击败,则 yy 出手攻击 xx;
  • 一次普通攻击造成的伤害为 max⁡(0,攻击力−对方的防御力)\max(0, \text{攻击力} - \text{对方的防御力}),战斗中双方的属性不会改变,因此每回合造成的伤害是固定的;
  • 如果双方造成的伤害都是 00,那么无论打多久都分不出胜负,此时跳过这次操作,任何人都不被淘汰;
  • 否则先倒下的一方被淘汰。特别的,如果同一个回合内双方都会被击败,则先出手的 xx 获胜。
  • 4 x y:把编号为 xx 的玩家的生命值增加 yy,但不会超过其生命值上限;若该玩家已淘汰则跳过。
  • 5 x:把所有玩家的生命值增加 xx,但不会超过各自的生命值上限。

输入格式

输入共 n+q+1n+q+1 行。

第一行四个用空格隔开的整数,依次为 n,q,k,rn, q, k, r。

接下来 nn 行,每行描述一名玩家,依次为:字符串 name、整数 health(初始生命值上限)、整数 xp(初始经验值)、整数 zy(职业编号)。

接下来 qq 行,每行描述一次操作,格式如题目描述所示。

输出格式

按输入顺序输出所有未被淘汰的玩家的个人数据,每名玩家一行,用单个空格分隔:

name level maxhp atk def xp zy

其中 maxhp 为生命值上限,xp 为当前剩余经验值。

输入输出样例 #1

输入 #1

3 10 5 10
小P 100 0 1
小I 100 0 2
小R 100 0 3
2 5
3 1 3 1
3 2 3 0
1 1 4
3 1 2 1
5 100
1 1 9
3 1 3 0
2 12
3 1 3 1

输出 #1

小P 5 124 29 29 0 1
小R 3 110 11 29 8 3

说明

样例解释

初始共有三名玩家小P、小I、小R,生命值上限都是 100100、经验值都是 00;小P 是战士(攻击 55、防御 55),小I 是刺客(攻击 99、防御 11),小R 是肉盾(攻击 11、防御 99)。

  • 第 11 次(2 5):所有玩家的经验都 +5+5。因为 L×n=1×3=3L \times n = 1 \times 3 = 3,三人各升到 22 级,经验变为 5−3=25-3=2。
  • 小P(战士):攻击、防御、生命上限各 +min⁡(5,10)+1=6+\min(5,10)+1=6,变为 11/11/10611 / 11 / 106;
  • 小I(刺客):攻击 +max⁡(5,10)=10+\max(5,10)=10,防御、生命上限各 +5+5,变为 19/6/10519 / 6 / 105;
  • 小R(肉盾):攻击、生命上限各 +5+5,防御 +10+10,变为 6/19/1056 / 19 / 105。
  • 第 22 次(3 1 3 1):小P 打小R。小P 对小R 的伤害为 max⁡(0,11−19)=0\max(0, 11-19)=0,小R 对小P 的伤害为 max⁡(0,6−11)=0\max(0, 6-11)=0,分不出胜负,跳过。
  • 第 33 次(3 2 3 0):tf=0tf=0,对方拒绝,跳过。
  • 第 44 次(1 1 4):小P 经验变为 2+4=62+4=6。因为 2×3=62 \times 3 = 6,小P 升到 33 级,经验变为 00,攻击、防御、生命上限各 +6+6,变为 17/17/11217 / 17 / 112。
  • 第 55 次(3 1 2 1):小P 打小I,小I 接受。小P 对小I 的伤害为 max⁡(0,17−6)=11\max(0,17-6)=11,小I 对小P 的伤害为 max⁡(0,19−17)=2\max(0,19-17)=2。小I 需要被攻击 1010 次才会倒下,而小P 只需要承受 99 次攻击,因此小I 被淘汰,小P 剩余 112−18=94112-18=94 点生命。
  • 第 66 次(5 100):所有玩家回血 100100,小P 回满到 112112,小R 回满到 105105。
  • 第 77 次(1 1 9):小P 经验变为 99。因为 3×3=93 \times 3=9,小P 升到 44 级,经验归 00,攻击、防御、生命上限各 +6+6,变为 23/23/11823 / 23 / 118。
  • 第 88 次(3 1 3 0):tf=0tf=0,跳过。
  • 第 99 次(2 12):所有玩家经验 +12+12。小R 原有经验 22,变为 1414;因为 2×3=62 \times 3=6,小R 升到 33 级,经验变为 88(不足以再升一级);小P 原有经验 00,变为 1212;因为 4×3=124 \times 3=12,小P 升到 55 级,经验归 00。
  • 第 1010 次(3 1 3 1):小P 打小R。此时双方伤害都是 00,分不出胜负,跳过。

最终小P 和小R 都没有被淘汰,按输入顺序输出他们的数据。

数据范围

  • 对于 20%20\% 的数据,1≤n,q≤1001 \le n, q \le 100。保证没有法师职业。
  • 对于 50%50\% 的数据,1≤n,q≤10001 \le n, q \le 1000。
  • 对于 100%100\% 的数据,1≤n,q≤50001 \le n, q \le 5000,1≤k,r≤10111 \le k, r \le 10^{11},玩家的初始生命值上限与初始经验值均不超过 101110^{11},操作中出现的 x,yx, y 均满足 1≤x,y≤10111 \le x, y \le 10^{11}。