D. Xmas or Hysteria
D. Xmas or Hysteria
时间限制:每个测试点 2 秒 内存限制:每个测试点 512 MB
问题描述
群体狂乱(炉石传说) 你是 sus Franklin 正在策划一场圣诞节袭击,他在一个精灵村庄施放法术 群体狂乱。
有 n 个精灵,编号从 1 到 n,其中精灵 i 有一个生命值 h_i 和一个攻击力 a_i。最初,对于所有 i,h_i = a_i,并且所有 a_i 都是不同的。精灵 i 存活当且仅当其生命值为正(即 h_i > 0)。
当 Franklin 施放群体狂乱时,会重复以下过程: 1. 选择一对不同的存活精灵 x 和 y(即 h_x, h_y > 0),且精灵 x 在此前没有攻击过。如果不存在这样的配对,则终止过程。 2. 然后,精灵 x 攻击精灵 y,使 h_y 减少 a_x。同时,由于反冲力,h_x 减少 a_y。注意 a_x 和 a_y 保持不变。
这个过程将重复进行,直到无法选择一对有效的精灵为止。可以证明群体狂乱最多在 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, \dots, a_n (1 \le a_i \le 10^9) —— 精灵的初始攻击力和生命值。
保证所有 a_i 都是不同的。 保证所有测试用例的 n 之和不超过 2 \cdot 10^5。
输出格式
对于每个测试用例,如果不可能恰好有 m 个精灵存活,则输出 -1。
否则,按以下格式输出一个有效的攻击序列: 第一行,输出一个整数 k (0 \le k \le n) —— 群体狂乱的迭代次数。 接下来 k 行,第 i 行包含两个整数 x_i 和 y_i (1 \le x_i, y_i \le n, x_i \ne y_i),表示在第 i 次迭代中精灵 x_i 攻击了精灵 y_i。
该序列必须满足以下所有条件: - 在第 i 次迭代开始前,精灵 x_i 和 y_i 都存活,且精灵 x_i 在之前的任何迭代中都没有攻击过。 - 在第 k 次迭代之后,恰好有 m 个精灵存活,并且不存在一对不同的存活精灵 x 和 y 使得精灵 x 以前没有攻击过。
如果存在多个答案,你可以输出其中任何一个。任何满足上述条件的有效序列都将被接受。
样例输入
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
样例输出
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 存活。由于它们两个都已经攻击过了,无法再进行有效的攻击,群体狂乱终止。
在第二个测试用例中,第一次迭代唯一可能的选择 (x, y) 是 (1, 2) 或 (2, 1)。无论哪种情况,精灵 1 最终的生命值都会变成 -1,因此不可能在最后让两个精灵都存活。注意群体狂乱至少会进行一次迭代,因为第一次迭代时存在有效的 (x, y) 配对。
在第六个测试用例中,所有攻击结束后只有精灵 3 存活。尽管精灵 3 此前没有攻击过,群体狂乱仍然终止,因为没有其他精灵可供它攻击。