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