CF1879F Last Man Standing
题目描述
在一款电子游戏中有 $n$ 个英雄。每个英雄有一个生命值 $h$ 和初始护甲值 $a$。当前护甲值记为 $a_{\mathit{cur}}$,初始时等于 $a$。
当一个英雄受到 $x$ 点伤害时,发生如下情况:如果 $x < a_{\mathit{cur}}$,则从 $a_{\mathit{cur}}$ 中减去 $x$;否则,从 $h$ 中减去 $1$,并将 $a_{\mathit{cur}}$ 重新赋值为 $a$。
游戏开始时,你选择一个 $x$(一个严格大于 $0$ 的整数,可以任意大)。然后你对所有英雄进行轮流攻击:在一轮中,对所有存活的英雄各造成 $x$ 点伤害。当某个英雄的生命值变为 $0$ 时,该英雄死亡。所有英雄死亡时,游戏结束。
最后一个死亡的英雄将获得等于他作为唯一存活英雄的轮数的分数。其他英雄得分为 $0$。特别地,如果最后一轮有多个英雄同时死亡,则所有英雄得分为 $0$。
对于每一个可能的 $x$(从 $1$ 到无穷大),都要进行一次游戏。每次游戏结束后分数会重置。请问每个英雄在所有游戏中获得的最大分数是多少?
输入格式
第一行包含一个整数 $t$($1 \le t \le 10$),表示测试用例的数量。
每个测试用例的第一行包含一个整数 $n$($1 \le n \le 2 \times 10^5$),表示英雄的数量。
第二行包含 $n$ 个整数 $h_1, h_2, \dots, h_n$($1 \le h_i \le 2 \times 10^5$),表示每个英雄的生命值。
第三行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$($1 \le a_i \le 2 \times 10^5$),表示每个英雄的初始护甲值。
输出格式
对于每个测试用例,输出 $n$ 个整数,表示每个英雄在所有可能的 $x$ 下获得的最大分数。
说明/提示
在第一个测试用例中,当 $x = 1$ 时,游戏过程如下:
- 所有回合开始前:英雄的 $h = [3, 1, 2]$,$a_{\mathit{cur}} = [3, 11, 5]$;
- 第 $1$ 轮:每个英雄受到 $1$ 点伤害:$h$ 仍为 $[3, 1, 2]$,$a_{\mathit{cur}}$ 变为 $[2, 10, 4]$;
- 第 $2$ 轮:$h = [3, 1, 2]$,$a_{\mathit{cur}} = [1, 9, 3]$;
- 第 $3$ 轮:第一个英雄护甲耗尽,生命值减 $1$:$h = [2, 1, 2]$,$a_{\mathit{cur}} = [3, 8, 2]$;
- ...
- 第 $9$ 轮:第一个英雄死亡,生命值变为 $0$:$h = [0, 1, 1]$,$a_{\mathit{cur}} = [0, 2, 1]$;
- 第 $10$ 轮:第三个英雄死亡:$h = [0, 1, 0]$,$a_{\mathit{cur}} = [0, 1, 0]$;
- 第 $11$ 轮:第二个英雄死亡:$h = [0, 0, 0]$,$a_{\mathit{cur}} = [0, 0, 0]$。
第二个英雄是最后一个死亡的,并且有一轮是唯一存活的,因此他在该局游戏中获得 $1$ 分。
当 $x = 4$ 时,游戏过程如下:
- 第 $1$ 轮:$h = [2, 1, 2]$,$a_{\mathit{cur}} = [3, 7, 1]$;
- 第 $2$ 轮:$h = [1, 1, 1]$,$a_{\mathit{cur}} = [3, 3, 5]$;
- 第 $3$ 轮:$h = [0, 0, 1]$,$a_{\mathit{cur}} = [0, 0, 1]$;
- 第 $4$ 轮:$h = [0, 0, 0]$,$a_{\mathit{cur}} = [0, 0, 0]$;
第三个英雄是最后一个死亡的,并且有一轮是唯一存活的,因此他在该局游戏中获得 $1$ 分。
由 ChatGPT 4.1 翻译