Загрузка данных


import sys
from bisect import bisect_right

def solve():
    # Открываем файл с данными (убедись, что он лежит рядом со скриптом)
    try:
        with open('26.txt', 'r') as f:
            lines = f.readlines()
    except FileNotFoundError:
        print("Файл 26.txt не найден!")
        return

    if not lines:
        return

    # Считываем количество коробок
    N = int(lines[0].strip())
    boxes = []
    
    # Считываем данные о коробках (размер и материал)
    for i in range(1, N + 1):
        size, color = map(int, lines[i].split())
        boxes.append((size, color))

    # Сортируем коробки по размеру по возрастанию
    boxes.sort(key=lambda x: x[0])

    # Массивы для хранения минимального размера последней (самой большой) коробки 
    # для последовательности заданной длины.
    # Индекс в массиве = длина собранной "матрёшки".
    # m0 - для матрёшек, где самая внешняя коробка материала 0
    # m1 - для матрёшек, где самая внешняя коробка материала 1
    m0 = [0] 
    m1 = [0]

    # Проходим по всем отсортированным коробкам
    for size, color in boxes:
        if color == 0:
            # Ищем самую длинную матрёшку с внешней коробкой цвета 1, 
            # размер которой <= size - 3 (то есть наша текущая коробка налезет на неё)
            idx = bisect_right(m1, size - 3) - 1
            if idx >= 0:
                new_len = idx + 1 # Длина новой матрёшки
                # Так как мы идем по возрастанию размеров, первая найденная матрёшка 
                # новой длины гарантированно будет иметь минимально возможный размер
                if new_len == len(m0):
                    m0.append(size)
        else: # color == 1
            # Делаем то же самое, но ищем в массиве цвета 0
            idx = bisect_right(m0, size - 3) - 1
            if idx >= 0:
                new_len = idx + 1
                if new_len == len(m1):
                    m1.append(size)

    # Максимальные длины матрёшек для каждого из цветов
    max_len_0 = len(m0) - 1
    max_len_1 = len(m1) - 1
    
    # Общая максимальная длина
    max_len = max(max_len_0, max_len_1)
    
    # Ищем минимальный размер самой большой коробки среди матрёшек максимальной длины
    min_largest = float('inf')
    if max_len_0 == max_len:
        min_largest = min(min_largest, m0[max_len])
    if max_len_1 == max_len:
        min_largest = min(min_largest, m1[max_len])
        
    # Выводим ответ: максимальное количество коробок и минимальный размер самой большой
    print(f"Ответ: {max_len} {min_largest}")

if __name__ == '__main__':
    solve()