[THUPC2021] 群星连结
题目背景
众所周知,群星和公主连结联动啦!联动的结果是一个叫做群星连结的游戏。
这是一个双人回合制竞赛游戏,双方记为 Alice 和 Bob。游戏有若干**回合**,每个回合依次由先手和后手分别行动一次。
现在聪明的你写了一个优秀的 AI 来玩这个游戏,这个 AI 会遵从游戏规则,并且按照游戏过程条目里既定的策略进行游戏。但是由于您太强了,所以世界上只有这么一个 AI,所以只能自己和自己打。
现在给定这个游戏的初始局面,让这个 AI 分别作为 Alice 和 Bob 对战,其中 Alice 先手。你需要模拟游戏过程,并且判断最终是 Alice 获胜还是 Bob 获胜。
游戏初始局面会通过输入给出。
**【提示】**
本题中,**伤害**、**真实伤害**、**生命值扣除**是三个不同的概念,请注意区分。
题目描述
#### 基础参数
首先,在游戏开始之前,每个玩家需要选择恰好 $n$ 个角色,并编号 $1,2,3,\dots,n$。
每个角色都有一些基础参数:
1. $HP,hp$ :最大生命值,生命值;
2. $MP,mp$:最大能量值,能量值;
3. $atk,\Delta_{atk}$:基础攻击力,攻击力增益;
4. $def,\Delta_{def}$:基础防御力,防御力增益;
另外,为方便起见,下文中记 $A=\max(atk+\Delta_{atk},1)$,$D=\max(def+\Delta_{def},0)$。
游戏开始时,生命值 $hp$ 等于最大生命值 $HP$,能量值 $mp$、攻击力增益 $\Delta_{atk}$、防御力增益 $\Delta_{def}$ 均等于 $0$。
$HP,MP,atk,def$ 将由输入给出。
除此之外,每个角色分别拥有一个**天赋**和一个**技能**,分别见**天赋**条目和**技能**条目。
#### 死亡判定
游戏过程的任意时刻,如果某个角色生命值 $hp$ 降到 $0$ **及**以下,则判定该角色【死亡】。
一个角色一旦被判定为【死亡】,则该角色将从场上完全退出,并且生命值被恒定为 $0$,不能通过任何方式回复生命值(即不能起死回生,即使拥有【天赋 — 心胜于物】;另外,也不能通过己方其它角色技能回复生命值),不能普通攻击、发动技能,也不能被选定为优先目标,因而不能被普通攻击。
总之就是不以任何形式参与后续游戏的进程,并且本题中所有“全体”、“所有角色”等词均不包含【死亡】角色。
当某方角色全部被判定【死亡】时,游戏立刻结束,并判定另一方胜利(若此时仍有尚未完成的结算,也全部不再进行)。
#### 参数溢出
在游戏过程的任意时刻,如果某个角色的生命值 $hp>HP$,则 $hp$ 会立刻变成为 $HP$。
在游戏过程的任意时刻,如果某个角色的能量值 $mp>MP$,则 $mp$ 会立刻变成为 $MP$。
#### 优先目标
游戏开始前,每个玩家需要为每个角色选定一个攻击顺序。
具体来说,对编号为 $i$ 的角色,需要确定一个攻击顺序 $p_{i,1},\ldots,p_{i,n}$,满足 $p_{i,1},\ldots,p_{i,n}$ 是一个关于 $1,\ldots,n$ 的排列。
游戏过程的任意时刻,称编号为 $i$ 的优先目标是 $p_{i,j}$,当且仅当 $p_{i,1},\ldots,p_{i,j-1}$ 全部【死亡】,并且 $p_{i,j}$ 没有【死亡】。
#### 普通攻击
普通攻击会对优先目标造成 $A$ 点伤害。
拥有【天赋 — 超凡入圣】的角色则会对优先目标造成 $A$ 点真实伤害。详见**天赋**条目。
拥有【天赋 — 星河力量投射】的角色普通攻击会附加真实伤害。详见**天赋**条目。
#### 天赋
天赋有以下几种类型(每行前的编号为天赋类型的编号,圆括弧 `()` 内部为附加参数):
0. 【天赋 — 我自闭了】该角色的天赋毫无作用;
1. 【天赋 — 血肉皮囊】该角色免疫一半真实伤害。详情见**生命值扣除环节**条目。
**真实伤害见生命值扣除条目**;
2. 【天赋 — 星河力量投射】$(x)$ 该角色每次普通攻击会附加的 $x$ 点真实伤害;
3. 【天赋 — 心胜于物】$(x,y)$ 该角色每次己方行动结束后回复 $x$ 点生命值,并**额外**回复 $y$ 点能量值;
4. 【天赋 — 超凡入圣】该角色的普通攻击被视为真实伤害攻击,即该角色的普通攻击不造成伤害,但造成 $A$ 点真实伤害。
5. 【天赋 — 科技至上】$(x,y)$ 该角色每次进行普通攻击后,回复 $x$ 点生命值;该角色每次发动技能后,**额外**回复 $y$ 点能量值。注意:如果普通攻击或发动技能造成对方全部角色【死亡】,则该角色不再回复生命值或能量值。
本题保证天赋附加参数均为**正**整数(但在输入数据中可能会有 $0$,详情参见**输入格式**条目)。
#### 技能
当某个角色能量值等于其最大能量值时(并且在游戏过程中被选定为发动技能的角色),可以清零其能量值并发动一次技能。
技能有以下几种类型(每行前的编号为技能类型的编号,圆括弧` ()` 内部为附加参数):
0. 【技能:心态崩了!】该角色的主动技能毫无作用。注意,该技能仍然可以被发动,只不过毫无效果而已。
1. 【技能:格林炸裂!】$(x)$ 对敌方**所有**角色造成 $x$ 点伤害,**然后**使敌方**所有**角色能量值减少 $\left\lfloor\frac{mp_{enemy}}{10}\right\rfloor$,其中 $mp_{enemy}$ 为敌方该角色能量值(即对于每个敌方角色,若其当前的能量值为 $mp_{enemy}$,那么受此技能影响,其能量值会变成 $mp_{enemy}-\left\lfloor\frac{mp_{enemy}}{10}\right\rfloor$)。注意,根据规则,敌方角色会先受到伤害而进入生命值扣除环节,在该环节中回复能量值,然后再被该技能扣除能量值。
2. 【技能:日 (zhou) 昇 (ji) 之 (dao) 雨 (dan)!】对敌方**所有**角色造成 $A$ 点真实伤害。
3. 【技能:天楼霸断剑!】$(x)$ 对敌方**所有**目标造成 $\min\left(\left\lfloor\frac{HP_{enemy}}{10}\right\rfloor,x\times A\right)$ 点伤害,其中 $HP_{enemy}$ 为被攻击目标的最大生命值。
4. 【技能:演出开始!】$(x,y)$ 设当前为第 $t$ 回合,则从发动技能开始,到第 $t+x-1$ 回合结束期间,在己方行动结束时,己方全体角色**额外**回复 $y$ 点能量值。
5. 【技能:天狼噬斩!】$(x)$ 将优先目标的防御力增益减小 $x$,**然后**对优先目标造成 $A$ 点真实伤害。
6. 【技能:地 (太) 球 (虚) 蓝 (苍) 色 (蓝) 闪 (闪) 电!】$(x,y)$ 对优先目标造成 $A$ 点真实伤害。另外,设当前为第 $t$ 回合,则从发动技能开始,到第 $t+x-1$ 回合结束期间,敌方所有角色攻击力增益减小 $y$。
7. 【技能:极光绽放!】$(x,y,z)$ 使己方未【死亡】角色生命值最低(如有多个,则编号最小)的恰好一名角色回复 $z$ 点生命值。另外,设当前为第 $t$ 回合,则从发动技能开始到第 $t+x-1$ 回合结束期间,己方所有角色攻击力增益增大 $y$。
8. 【技能:流星!】$(x,y)$ 对敌方所有角色造成 $A$ 点伤害。设当前为第 $t$ 回合,则**从该技能造成伤害后**,到第 $t+x-1$ 回合结束期间,使敌方所有角色防御力增益减小 $y$。注意,本技能先造成伤害,再产生减益。
9. 【技能:精灵庇护!】$(x,y,z)$ 己方全体角色回复 $z$ 点生命值。设当前为第 $t$ 回合,则从发动技能开始,到第 $t+x-1$ 回合结束期间,己方所有角色防御力增益增大 $y$。
10. 【技能:全力超全开!轮回之终末!】$(x)$ 己方所有角色基础攻击力 $atk$、基础防御力 $def$ 变为原先的两倍 $2\times atk, 2\times def$;未【死亡】角色生命值 $hp$ 变为 $\max\left(\left\lfloor\frac{HP}2\right\rfloor,hp\right)$,能量值 $mp$ 变为 $\max\left(\left\lfloor\frac{MP}2\right\rfloor,mp\right)$;设当前为第 $t$ 回合,则从发动技能开始,到第 $t+x-1$ 回合结束期间,己方行动结束时,己方所有角色**额外**回复 $1$ 点能量值。在第 $t+x-1$ 回合结束时,若敌方仍有角色未【死亡】,则己方全体角色强制生命值清零,并被判定为【死亡】。另外,在发动该技能时,场上所有拥有这个技能的角色(包括自己)的技能将被强制替换为 0 号【技能:心态崩了!】(因此该技能最多在游戏中被发动一次)。
本题保证技能附加参数均为**正**整数(但在输入数据中可能会有 $0$,详情参见**输入**条目)。
注意:上述形如“设当前为第 $t$ 回合,则从发动技能开始到第 $t+x-1$ 回合结束期间,……”产生的效果是**可以叠加**的。
#### 生命回复与能量回复
生命值仅可通过天赋和技能回复。
己方行动结束时,己方全体角色能量值增加 $1$。拥有【天赋 — 心胜于物】的角色,以及受【技能:演出开始!】和【技能:全力超全开!轮回之终末!】影响的角色可以额外回复能量值。
当己方角色进行普通攻击或者发动技能后,该角色能量值增加 $1$。拥有【天赋 — 科技至上】的角色发动技能后会回复额外的能量值。
注意,发动技能时,先扣除全部能量值,再发动技能,然后再增加能量值。
特别的,若该技能为【技能:全力超全开!轮回之终末!】,则使发动该技能的角色 $mp=\max\left(mp,\left\lfloor\frac{MP}2\right\rfloor\right)$ 后再增加能量值。
当己方角色因受到伤害而进入生命值扣除环节时,该角色能量值增加 $1$(无论其是否实际扣除生命值)。
**生命值扣除见生命值扣除环节。**
#### 生命值扣除环节
当角色受到伤害或者真实伤害时,该角色立即进入生命值扣除环节(注意,即使受到了 $0$ 点伤害,也会进入生命值扣除环节)。
进入生命值扣除环节后,由能量回复条目,该角色能量值增加 $1$。
假设其受到 $x$ 点伤害和 $y$ 点真实伤害,那么:
- 若该角色因拥有【天赋—血肉皮囊】而免疫一半真实伤害,则其生命值扣除 $\max(x-D,0)+y-\left\lfloor\frac y2\right\rfloor$。
- 否则,其生命值扣除 $\max(x-D,0)+y$。
#### 游戏过程
游戏开始后,可视为若干回合,编号从 $1$ 开始。
每个回合,可以划分为如下 $5$ 个阶段:Alice 行动(期间)、Alice 行动结束、Bob 行动(期间)、Bob 行动结束、当前回合结束。
己方行动期间,
1. 如果己方存在至少一个角色可以发动技能时,则按照技能编号从大到小的顺序选择其中一位发动技能。如果有多个角色满足可以发动相同编号的技能,则选择这些角色中角色编号最大的角色发动技能。
2. 如果己方没有角色可以发动技能,则选择一个优先目标生命值最高的角色发动普通攻击。如果有多个角色的优先目标生命值最高,则选择能对优先目标扣除更多生命值(而不是造成更多伤害!)的角色发动攻击。如果仍然有多个角色可以选择,则选择其中编号最大的角色发动普通攻击。
己方行动结束。
注意,己方行动期间,仅能选择一位角色发动技能,或者选择一位角色进行普通攻击。
输入输出格式
输入格式
第一行一个正整数 $n$,表示 `Alice` 和 `Bob` 分别有 $n$ 个角色。
接下来 $4 n$ 行,第 $4 i - 3$ 到第 $4 i$ 行描述 `Alice` 的编号为 $i$ 的角色。
在这四行中:
- 第一行,四个非负整数 $HP,MP,atk,def$ 分别表示该角色的最大生命值、最大能量值、基础攻击力、基础防御力,保证 $HP,MP>0$。
- 第二行,$n$ 个正整数 $p_{i,1},p_{i,2}, \ldots ,p_{i,n}$,表示该角色攻击顺序,保证这是一个关于 $1$ 到 $n$ 的排列。
- 第三行,三个非负整数 $tf,x,y$ 表示天赋编号以及附加参数。如果该天赋附加参数不足两个,那么你可以忽略多余的部分(保证此时多余的部分在输入数据中是 $0$)。
- 第四行,四个非负整数 $jn,x,y,z$ 表示技能编号及附加参数。如果该技能附加参数不足三个,那么你可以忽略多余的部分(保证此时多余的部分在输入数据中是 $0$)。
接下来 $4n$ 行描述 `Bob` 的 $n$ 个角色,形式同上。
输出格式
如果游戏能够以某一方胜利而结束,那么:
- 第一行,输出一个正整数 $x$,表示游戏在第 $x$ 个回合结束的。
- 第二行,输出一个字符串(`Alice` 或 `Bob`)表示胜者。
- 第三行,输出 $n$ 个非负整数,依次表示胜者的每一个角色在游戏结束时的 $hp$,若该角色已死亡则输出 $0$。
如果游戏永远不会结束或者双方平局,请输出任意卖萌表情。
输入输出样例
输入样例 #1
3
2 8 1 1
1 2 3
3 1 1
7 2 1 2
6 6 3 0
1 2 3
5 1 1
7 2 1 1
99 10 1 1
2 1 3
1 0 0
10 10 0 0
9 10 1 0
1 2 3
2 1 0
8 2 1 0
8 7 2 1
2 1 3
1 0 0
4 2 1 0
99 10 2 0
2 1 3
1 0 0
10 10 0 0
输出样例 #1
15
Alice
2 0 96
说明
**【数据范围】**
$n \le 10$,$HP, MP, atk \gt 0$,$def \ge 0$。
保证在游戏中的任意时刻,所有题面中提及到的参数及表达式的绝对值均不超过 ${10}^9$。
保证游戏在 $23333$ 回合内结束。
**【题目来源】**
来自 2021 清华大学学生程序设计竞赛暨高校邀请赛(THUPC2021)。
题解等资源可在 [https://github.com/yylidiw/thupc_2/tree/master](https://github.com/yylidiw/thupc_2/tree/master) 查看。