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

Задача . D. Сережа и множества


У Сережи есть m непустых множеств целых чисел A1, A2, ..., Am. По счастливой случайности оказалось, что данные множества являются разбиением множества всех целых чисел от 1 до n. Другими словами, для любого целого v (1 ≤ v ≤ n) существует ровно одно множество At такое, что . Кроме того у него есть целое число d.

Сережа решил выбрать несколько множеств из имеющихся. Предположим, что i1, i2, ..., ik (1 ≤ i1 < i2 < ... < ik ≤ m) — это индексы выбранных множеств. Тогда определим массив целых чисел b равный объединению выбранных множеств, то есть . Будем считать, что массив b отсортирован по возрастанию. Элемент с номером j в этом массиве (j-ый по возрастанию) будем обозначать bj. Сережа считает, что его выбор множеств правильный, если выполняются условия:

b1 ≤ dbi + 1 - bi ≤ d (1 ≤ i < |b|); n - d + 1 ≤ b|b|.

Сережа хочет найти k — минимальное количество выбранных множеств, чтобы его выбор был правильным. Помогите ему в этом.

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

В первой строке содержатся целые числа n, m, d (1 ≤ d ≤ n ≤ 105, 1 ≤ m ≤ 20). В следующих m строках содержатся множества, первое число в i-ой строке si (1 ≤ si ≤ n) означает размер i-го множества, далее в строке содержатся si различных целых чисел от 1 до n — множество Ai.

Гарантируется, что множества образуют разбиение всех целых чисел от 1 до n.

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

В единственной строке выведите ответ на задачу — минимальное значение k при правильном выборе.


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

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

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