4340. Армия магов

 

На собрании стояла довлеющая тишина. Стало окончательно ясно, что после битвы на Севере все члены великого войска Коалиции закончат карьеру боевых магов и займут руководящие должности Наставников. А значит, нужно срочно набирать новую боеспособную армию. Лишь мудрый Сандро нарушал тишину скрипом пера о бумагу – он выписывал имена достойных по его мнению кандидатов. Наконец, он закончил. На листке были написаны 5n имён. Но суровые законы предписывали выбрать лишь n достойнейших магов. После долгих споров, было решено создать армию, в которой каждая пара магов уважала бы друг друга.

Как известно, в королевстве все маги живут в отдельных домах, расположенных в точках плоскости с целыми координатами. Так получилось, что маги уважают друг друга в том и только в том случае, если на отрезке, соединяющем их дома, лежит хотя бы одна точка с целыми координатами, отличная от концов отрезка. Например, если дома расположены в точках (1, 1) и (5, 5), то эти маги уважают друг друга, так как между их домами есть точка (2, 2). А вот жильцы домов с координатами (0, 0) и (1, 10), увы, не относятся друг к другу с уважением. Помогите правительству королевства собрать армию!

 

Вход. В первой строке записано целое число n (1 ≤ n ≤ 5000). В i-ой из следующих 5n строк записана пара целых чисел x и y, по модулю не превосходящих 10000 – координаты дома i-го кандидата в армию. Все дома расположены в различных точках.

 

Выход. Если искомая армия существует, в первой строке выведите "OK", а во второй строке запишите через пробел в произвольном порядке n чисел – номера выбранных кандидатов. Если возможных ответов несколько, выведите любой. Если армию создать нельзя, выведите "IMPOSSIBLE".

 

Пример входа

Пример выхода

2

1 1

5 5

0 0

2 2

0 10

6 6

7 7

8 8

9 9

10 10

OK

2 1

 

 

РЕШЕНИЕ

принцип Дирихле

 

Анализ алгоритма

Заведем 4 урны: первая урна хранит координаты (x, y) для которых обе координаты четные, вторая – для которой x четно а y нечетно, в третьей урне x нечетно а y четно, в четвертой обе координаты нечетны. Сортировкой подсчетом отсортируем координаты домов по урнам. Осталось найти урну, содержащую не менее n координат (по принципу Дирихле такая урна всегда будет существовать: у нас имеется 5n домов и 4 урны) и вывести ее произвольные n координат.

Жильцы любой пары домов из одной урны всегда уважают друг друга, так как между ними всегда существует точка с целочисленными координатами.

Для любого теста ответ всегда существует.

 

Реализация алгоритма

Объявим массив урн для сортировки домов.

 

vector<int> m[2][2];

 

Читаем значение n. Сортируем дома по урнам.

 

scanf("%d",&n);

for(i = 1; i <= 5*n; i++)

{

  scanf("%d %d",&x,&y); 

  m[x & 1][y & 1].push_back(i);

}

 

Ищем, какая из урн содержит как минимум n домов.

 

if (m[0][0].size() >= n) x = 0, y = 0; else

if (m[0][1].size() >= n) x = 0, y = 1; else

if (m[1][0].size() >= n) x = 1, y = 0; else x = y = 1;

 

Выводим ответ – из урны (x, y) выводим первые n координат.

 

printf("OK\n");

for(i = 0; i < n - 1; i++)

  printf("%d ",m[x][y][i]);

printf("%d\n",m[x][y][n-1]);