CF2178D Xmas or Hysteria
题目描述
[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$ 个精灵存活;或判断是否不存在这样的攻击序列。
输入格式
每个测试包含多个测试用例。第一行包含一个整数 $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}$。
输出格式
对于每个测试用例,如果无法让恰好 $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$ 未攻击过(即流程无法继续)。
如有多组答案,输出任意一组合法解即可。只要满足上述条件即可被判为正确。
说明/提示
在第一个测试用例中,可能的攻击序列如下:
\# $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 依然终止。
由 ChatGPT 5 翻译