Олимпиадный тренинг

Задача . C. Параллельный поиск


Допустим, у вас есть \(n\) коробок. В \(i\)-й коробке бесконечно много шариков цвета \(i\). Иногда вам нужно получить шарик какого-то определенного цвета; но вы слишком ленивы, чтобы брать шарик из коробки самостоятельно.

Вы купили двух роботов, которые будут приносить вам шарики. Теперь этих роботов надо запрограммировать. Для этого вы должны сформировать два списка \([a_1, a_2, \dots, a_k]\) и \([b_1, b_2, \dots, b_{n-k}]\), где список \(a\) — это список коробок, назначенных первому роботу, а список \(b\) — коробки, назначенные второму роботу. Каждое целое число от \(1\) до \(n\) должно принадлежать ровно одному из этих списков.

Когда вы даете роботам команду «принести шарик цвета \(x\)», они выполняют ее следующим образом. Каждый робот проходится по тому списку коробок, который был назначен этому роботу (в том порядке, в котором коробки находятся в списке), и просматривает содержимое каждой коробки. Первый робот тратит \(s_1\) секунд, чтобы просмотреть содержимое коробки; второй робот тратит \(s_2\) секунд. Как только какой-то робот найдет коробку с шарами цвета \(x\) и просмотрит ее содержимое, поиск завершается. Время поиска — это количество секунд, прошедшее от начала поиска до того, как один из роботов просмотрит содержимое коробки \(x\). Если робот просмотрел все коробки, назначенные ему, после этого он ничего не делает.

Например, пусть \(s_1 = 2\), \(s_2 = 3\), \(a = [4, 1, 5, 3, 7]\), \(b = [2, 6]\). Если вы запросите шарик цвета \(3\), произойдет следующее:

  • сначала первый робот начнет просматривать коробку \(4\), а второй — коробку \(2\);
  • в конце \(2\)-й секунды первый робот закончит просматривать коробку \(4\). Это не та коробка, которая нужна, поэтому робот начинает просматривать коробку \(1\);
  • в конце \(3\)-й секунды второй робот закончит просматривать коробку \(2\). Это не та коробка, которая нужна, поэтому робот начинает просматривать коробку \(6\);
  • в конце \(4\)-й секунды первый робот закончит просматривать коробку \(1\). Это не та коробка, которая нужна, поэтому робот начинает просматривать коробку \(5\);
  • в конце \(6\)-й секунды первый робот закончит просматривать коробку \(5\). Это не та коробка, которая нужна, поэтому робот начинает просматривать коробку \(3\). В тот же самый момент второй робот закончит просматривать коробку \(6\). Это не та коробка, которая нужна, и второй робот закончил просматривать все назначенные ему коробки, поэтому больше он ничего не делает;
  • в конце \(8\)-й секунды первый робот закончит просматривать коробку \(3\). Это та коробка, которая вам нужна, поэтому поиск завершается;
  • итак, время поиска равно \(8\) секундам.

Вы планируете запросить шарик цвета \(1\) \(r_1\) раз, шарик цвета \(2\)\(r_2\) раз, и так далее. Составьте списки \(a\) и \(b\) таким образом, чтобы суммарное время поиска было как можно меньше.

Входные данные

В первой строке выведите одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк:

  • в первой строке заданы три целых числа \(n\), \(s_1\), \(s_2\) (\(2 \le n \le 2 \cdot 10^5\); \(1 \le s_1, s_2 \le 10\));
  • во второй строке заданы \(n\) целых чисел \(r_1, r_2, \dots, r_n\) (\(1 \le r_i \le 10^6\)).

Дополнительное ограничение на входные данные: сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите две строки. В первой строке выведите список \(a\), во второй — список \(b\). Каждый список нужно вывести следующим образом: сначала размер списка, потом его элементы.

Если оптимальных ответов несколько, выведите любой из них.


Примеры
Входные данныеВыходные данные
1 3
7 3 1
8 6 4 4 4 1 7
5 1 10
1 1 1 1 1
8 1 1
4 5 6 8 1 7 3 2
2 5 6
5 1 7 2 4 3
5 4 3 5 2 1
0
4 4 2 7 5
4 6 3 1 8

time 2000 ms
memory 512 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w643
Комментарий учителя