A16809 | Xmas or Hysteria
时间限制1s
内存限制256MB
通过 / 提交0/0
题目描述
[Mass Hysteria](https://hearthstone.blizzard.com/en-us/cards/50071-mass-hysteria)(炉石传说)
$\color{white}{\text{You are sus}}$
Franklin 正在策划一场圣诞袭击,他将在一个精灵村庄中施放 Mass Hysteria(集体狂乱)法术。
村庄中有 $n$ 个精灵,编号为 $1$ 到 $n$,其中第 $i$ 个精灵拥有生命值 $h_i$ 和攻击力 $a_i$。起始时,$h_i = a_i$,所有 $a_i$ 均不相同。当 $h_i > 0$ 时,精灵 $i$ 视为存活。
当 Franklin 施放 Mass Hysteria 时,过程如下反复执行:
- 选择一对尚存活的不同精灵 $x$ 和 $y$(即 $h_x, h_y > 0$),其中精灵 $x$ 之前没有进行过攻击。如果已不存在这样的精灵对,则流程终止。
- 然后,精灵 $x$ 攻击精灵 $y$,$h_y$ 减少 $a_x$,并且由于反作用力,$h_x$ 也减少 $a_y$。注意 $a_x$ 和 $a_y$ 始终保持不变。
该过程会反复进行,直到无法再选择有效的精灵对为止。可以证明 Mass Hysteria 最多进行 $n$ 次迭代。
给定一个整数 $m$,请你构造一个合理的攻击序列,使得过程结束时正好有 $m$ 个精灵存活;或判断是否不存在这样的攻击序列。
$\color{white}{\text{You are sus}}$
Franklin 正在策划一场圣诞袭击,他将在一个精灵村庄中施放 Mass Hysteria(集体狂乱)法术。
村庄中有 $n$ 个精灵,编号为 $1$ 到 $n$,其中第 $i$ 个精灵拥有生命值 $h_i$ 和攻击力 $a_i$。起始时,$h_i = a_i$,所有 $a_i$ 均不相同。当 $h_i > 0$ 时,精灵 $i$ 视为存活。
当 Franklin 施放 Mass Hysteria 时,过程如下反复执行:
- 选择一对尚存活的不同精灵 $x$ 和 $y$(即 $h_x, h_y > 0$),其中精灵 $x$ 之前没有进行过攻击。如果已不存在这样的精灵对,则流程终止。
- 然后,精灵 $x$ 攻击精灵 $y$,$h_y$ 减少 $a_x$,并且由于反作用力,$h_x$ 也减少 $a_y$。注意 $a_x$ 和 $a_y$ 始终保持不变。
该过程会反复进行,直到无法再选择有效的精灵对为止。可以证明 Mass Hysteria 最多进行 $n$ 次迭代。
给定一个整数 $m$,请你构造一个合理的攻击序列,使得过程结束时正好有 $m$ 个精灵存活;或判断是否不存在这样的攻击序列。
输入格式
每个测试包含多个测试用例。第一行包含一个整数 $t$($1\le t\le 10^4$),表示测试用例数。每个测试用例描述如下。
每个测试用例的第一行包含两个整数 $n$ 和 $m$($2\le n\le 2\cdot 10^5,\,0\le m\le n$),分别表示村庄中精灵的数量和最后希望存活的精灵数。
第二行包含 $n$ 个整数 $a_1,a_2,\ldots,a_n$($1\le a_i\le 10^9$),表示每个精灵初始时的攻击力与生命值。
保证所有的 $a_i$ 互不相同。
保证所有用例的 $\sum n \le 2\cdot 10^{5}$。
每个测试用例的第一行包含两个整数 $n$ 和 $m$($2\le n\le 2\cdot 10^5,\,0\le m\le n$),分别表示村庄中精灵的数量和最后希望存活的精灵数。
第二行包含 $n$ 个整数 $a_1,a_2,\ldots,a_n$($1\le a_i\le 10^9$),表示每个精灵初始时的攻击力与生命值。
保证所有的 $a_i$ 互不相同。
保证所有用例的 $\sum n \le 2\cdot 10^{5}$。
输出格式
对于每个测试用例,如果无法让恰好 $m$ 个精灵存活,输出 $-1$。
否则,输出一组合法的攻击操作序列,格式如下:
- 第一行输出一个整数 $k$($0\le k\le n$),表示 Mass Hysteria 共进行了 $k$ 次迭代。
- 接下来的 $k$ 行,每行输出两个整数 $x_i$ 和 $y_i$($1\le x_i, y_i \le n$,$x_i \ne y_i$),表示第 $i$ 次迭代中精灵 $x_i$ 攻击精灵 $y_i$。
输出序列必须满足如下条件:
- 在每次攻击前,$x_i$ 和 $y_i$ 均存活,且 $x_i$ 此前未进行过攻击;
- 第 $k$ 次攻击后,恰好 $m$ 个精灵存活,且不存在一对剩余存活的不同精灵 $(x, y)$ 满足 $x$ 未攻击过(即流程无法继续)。
如有多组答案,输出任意一组合法解即可。只要满足上述条件即可被判为正确。
否则,输出一组合法的攻击操作序列,格式如下:
- 第一行输出一个整数 $k$($0\le k\le n$),表示 Mass Hysteria 共进行了 $k$ 次迭代。
- 接下来的 $k$ 行,每行输出两个整数 $x_i$ 和 $y_i$($1\le x_i, y_i \le n$,$x_i \ne y_i$),表示第 $i$ 次迭代中精灵 $x_i$ 攻击精灵 $y_i$。
输出序列必须满足如下条件:
- 在每次攻击前,$x_i$ 和 $y_i$ 均存活,且 $x_i$ 此前未进行过攻击;
- 第 $k$ 次攻击后,恰好 $m$ 个精灵存活,且不存在一对剩余存活的不同精灵 $(x, y)$ 满足 $x$ 未攻击过(即流程无法继续)。
如有多组答案,输出任意一组合法解即可。只要满足上述条件即可被判为正确。
输入输出样例
输入 #1
7 4 2 1 4 2 3 2 2 6 7 3 0 1 2 3 3 1 1 2 3 3 2 1 2 3 4 1 2 3 4 5 6 0 998244353 1000000000 314159265 676767677 999999999 987654321
输出 #1
2 3 1 2 4 -1 2 3 2 1 3 2 1 2 3 2 -1 2 1 4 4 2 4 3 1 2 5 6 1 4 2
在第一个测试用例中,可能的攻击序列如下:
\# $x$ $y$ 攻击后生命值 攻击过的精灵
0 —— $[1, 4, 2, 3]$ $[]$
1 $3$ $1$ $[-1, 4, 1, 3]$ $[3]$
2 $2$ $4$ $[-1, 1, 1, -1]$ $[2, 3]$
经过 $2$ 次攻击,只剩下精灵 $2$ 和 $3$ 存活。由于两者均已攻击过,无法继续攻击,Mass Hysteria 结束。
在第二个测试用例中,第一次攻击的合法 $(x, y)$ 只有 $(1, 2)$ 或 $(2, 1)$。无论选择哪一种,精灵 $1$ 生命值都变成 $-1$,因此无法让两个精灵同时存活在最后。注意 Mass Hysteria 至少会进行一次攻击,因为开局存在合法的精灵对。
在第六个测试用例中,最后只剩精灵 $3$ 存活。即便精灵 $3$ 从未攻击过,但由于没有其它精灵可攻击,Mass Hysteria 依然终止。
\# $x$ $y$ 攻击后生命值 攻击过的精灵
0 —— $[1, 4, 2, 3]$ $[]$
1 $3$ $1$ $[-1, 4, 1, 3]$ $[3]$
2 $2$ $4$ $[-1, 1, 1, -1]$ $[2, 3]$
经过 $2$ 次攻击,只剩下精灵 $2$ 和 $3$ 存活。由于两者均已攻击过,无法继续攻击,Mass Hysteria 结束。
在第二个测试用例中,第一次攻击的合法 $(x, y)$ 只有 $(1, 2)$ 或 $(2, 1)$。无论选择哪一种,精灵 $1$ 生命值都变成 $-1$,因此无法让两个精灵同时存活在最后。注意 Mass Hysteria 至少会进行一次攻击,因为开局存在合法的精灵对。
在第六个测试用例中,最后只剩精灵 $3$ 存活。即便精灵 $3$ 从未攻击过,但由于没有其它精灵可攻击,Mass Hysteria 依然终止。
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?