QOJ.ac

QOJ

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

#5195. 群星连结

統計

题目背景

众所周知,群星和公主连结联动啦!联动的结果是一个叫做群星连结的游戏。

这是一个双人回合制竞赛游戏,双方记为 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},...,p_{i,n}$,满足 $p_{i,1},...,p_{i,n}$ 是一个关于 $1,...,n$ 的排列。

游戏过程的任意时刻,称编号为 $i$ 的优先目标是 $p_{i,j}$,当且仅当 $p_{i,1},...,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. 如果己方没有角色可以发动技能,则选择一个优先目标生命值最高的角色发动普通攻击。如果有多个角色的优先目标生命值最高,则选择能对优先目标扣除更多生命值(而不是造成更多伤害!)的 角色发动攻击。如果仍然有多个角色可以选择,则选择其中编号最大的角色发动普通攻击。

己方行动结束。

注意,己方行动期间,仅能选择一位角色发动技能,或者选择一位角色进行普通攻击。

输入格式

第 $1$ 行一个正整数 $n$ ,表示 AliceBob 分别有 $n$ 个角色。

接下来 $4n$ 行,第 $4i-3$ 到第 $4i$ 行描述 Alice 的编号为 $i$ 的角色。

在这$4$行中:

  • 第 $1$ 行,$4$ 个非负整数 $HP,MP,atk,def$ 分别表示该角色的最大生命值、最大能量值、基础攻击力、基础防御力,保证 $HP,MP>0$ 。
  • 第 $2$ 行,$n$ 个正整数 $p_{i,1},p_{i,2},...,p_{i,n}$ ,表示该角色攻击顺序,保证这是一个关于 $1$ 到 $n$ 的排列。
  • 第 $3$ 行,$3$ 个非负整数 $tf,x,y$ 表示天赋编号以及附加参数。如果该天赋附加参数不足两个,那么你可以忽略多余的部分(保证此时多余的部分在输入数据中是 $0$ )。
  • 第 $4$ 行,$4$ 个非负整数 $jn,x,y,z$ 表示技能编号及附加参数。如果该技能附加参数不足三个,那么你可以忽略多余的部分(保证此时多余的部分在输入数据中是 $0$ )。

接下来 $4n$ 行描述 Bob 的 $n$ 个角色,形式同上。

输出格式

如果游戏能够以某一方胜利而结束,那么:

  • 第 $1$ 行,输出一个正整数 $x$,表示游戏在第 $x$ 个回合结束的。
  • 第 $2$ 行,输出一个字符串(AliceBob)表示胜者。
  • 第 $3$ 行,输出 $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$ 回合内结束。

About Issues

We understand that our problem archive is not perfect. If you find any issues with the problem, including the statement, scoring configuration, time/memory limits, test cases, etc.

You may use this form to submit an issue regarding the problem. A problem moderator will review your issue and proceed it properly.

STOP! Before you submit an issue, please READ the following guidelines:

  1. This is not a place to publish a discussion, editorial, or requests to debug your code. Your issue will only be visible by you and problem moderators. Other users will not be able to view or reply your issues.
  2. Do not submit duplicated issues. If you have already submitted one, please wait for an moderator to review it. Submitting multiple issues will not speed up the review process and might cause your account to be banned.
  3. Issues must be filed in English or Chinese only.
  4. Be sure your issue is related to this problem. If you need to submit an issue regarding another problem, contest, category, etc., you should submit it to the corresponding page.

Active Issues 0

No issues in this category.

Closed/Resolved Issues 0

No issues in this category.