Впарке города питсбурга есть чудесная аллея, состоящая из n посаженных в один ряд деревьев, каждое одного из k сортов. в связи с тем, что питсбург принимает открытый чемпионат байтландии по программированию, было решено построить огромную арену для проведения соревнований. так, согласно этому плану вся аллея подлежала вырубке. однако министерство деревьев и кустов воспротивилось этому решению, и потребовало оставить некоторые из деревьев в покое. согласно новому плану строительства все деревья, которые не будут вырублены, должны образовывать один непрерывный отрезок, являющийся подотрезком исходного. каждого из k видов деревьев требуется сохранить хотя бы по одному экземпляру. на вас возложена найти отрезок наименьшей длины, удовлетворяющий указанным ограничениям.
входные данные
в первой строке входного файла находятся два числа n и k ( 1 ≤ n , k ≤ 25 ). во второй строке входного файла следуют n чисел (разделенных пробелами), i -ое число второй строки задает цвет i -ого слева дерева в аллее. гарантируется, что присутствует хотя бы одно дерево каждого цвета
выходные данные
в выходной файл выведите два числа, координаты левого и правого концов отрезка минимальной длины, удовлетворяющего условию. если оптимальных ответов несколько, выведите любой.
примеры
входные данные
5 3
1 2 1 3 2
выходные данные
2 4
входные данные
6 4
2 4 2 3 3 1
выходные данные
2 6
Шаг 1: Понимание задачи
Итак, у нас есть аллея в парке города Питсбурга, состоящая из n деревьев, каждое из k различных сортов. Нам необходимо найти отрезок минимальной длины, который будет содержать хотя бы по одному дереву каждого из k видов.
Шаг 2: Входные данные
В первой строке входного файла указаны два числа: n и k. Затем во второй строке следуют n чисел, каждое из которых обозначает цвет соответствующего дерева в аллее.
Шаг 3: Решение
Для начала, создадим словарь, который будет отображать каждый вид дерева на количество его экземпляров в аллее. Изначально все значения будут равны 0.
Далее, создадим переменные start и end, которые будут отображать левый и правый конец текущего отрезка.
Затем, используя две указательные переменные - left и right, инициализируем их значением start.
Затем мы начинаем двигаться вправо с переменной right до тех пор, пока не обнаружим все k видов деревьев в отрезке (т.е. пока количество разных видов деревьев меньше k). Каждый раз, когда мы двигаем right, мы увеличиваем значение в словаре для текущего вида дерева.
Когда мы найдем все k видов деревьев, мы сравниваем длину текущего отрезка с длиной наименьшего отрезка, найденного до этого момента. Если текущий отрезок короче, мы обновляем значения левого и правого концов на значения left и right соответственно.
Затем мы двигаем левую переменную left вправо до тех пор, пока значение в словаре для соответствующего вида дерева не станет равно 0. При каждом движении left мы уменьшаем значение в словаре.
Повторяем шаги 5 и 6, пока right не достигнет n-1.
Шаг 4: Выходные данные
После завершения алгоритма, мы выводим значения левого и правого концов отрезка минимальной длины, которые были найдены.
Шаг 5: Реализация на практике
Вот пример кода на языке Python, который выполняет описанный алгоритм:
```python
n, k = map(int, input().split())
trees = list(map(int, input().split()))
tree_count = {} # словарь для хранения количества видов деревьев
for i in range(k):
tree_count[i+1] = 0
min_length = float('inf') # инициализируем длину наименьшего отрезка
start = 0
end = 0
left = 0
while end < n:
if tree_count[trees[end]] == 0: # если встречаем новый вид дерева, увеличиваем количество видов
k -= 1
tree_count[trees[end]] += 1
while k == 0: # если нашли все виды деревьев, обновляем длину отрезка и двигаем левую переменную
if end - left < min_length:
min_length = end - left
start = left + 1
end = end + 1
tree_count[trees[left]] -= 1
if tree_count[trees[left]] == 0: # если для текущего вида дерева количество стало равно 0, увеличиваем количество видов
k += 1
left += 1
end += 1
print(start, end) # выводим значения левого и правого концов отрезка минимальной длины
```
Этот код будет считывать входные данные, выполнять решение и выводить результат в формате, указанном в условии задачи.
Надеюсь, это решение будет понятно для вас и поможет вам разобраться с задачей!