Мини-урок · перед практикой

Кубики

Пересечение и две разности множеств описывают требуемые группы.

Как к ней подойти

Увидите, как множества помогают сравнивать группы без повторяющихся элементов.

Коротко о теме

Множество хранит каждый элемент один раз. Пересечение a & b оставляет общие элементы, разность a - b - только элементы a, а объединение a | b собирает обе группы. Если важен порядок вывода, отсортируйте результат отдельно.

Ключевая идея · Операции над множествами

Пересечение даёт общие цвета, направленные разности — уникальные для каждого ребёнка.

Проверьте перед запуском

  • Выводите сначала общие цвета, затем только Ани, затем только Бори.
  • Даже для пустой группы нужно вывести количество 0.

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Операции над множествами

Пересечение даёт общие цвета, направленные разности — уникальные для каждого ребёнка.

n, m = map(int, input().split())
a = {int(input()) for _ in range(n)}
b = {int(input()) for _ in range(m)}
for group in (a & b, a - b, b - a):
    print(len(group))
    print(*sorted(group))

Время: O((n + m) log(n + m)) с сортировкой. Память: O(n + m).

Другой способ: Слияние отсортированных списков

Два указателя классифицируют цвета в возрастающем порядке; оставшийся хвост принадлежит только одному набору.

n, m = map(int, input().split())
a = sorted(int(input()) for _ in range(n))
b = sorted(int(input()) for _ in range(m))
i = j = 0
common, only_a, only_b = [], [], []
while i < n and j < m:
    if a[i] == b[j]:
        common.append(a[i])
        i += 1
        j += 1
    elif a[i] < b[j]:
        only_a.append(a[i])
        i += 1
    else:
        only_b.append(b[j])
        j += 1
only_a.extend(a[i:])
only_b.extend(b[j:])
for group in (common, only_a, only_b):
    print(len(group))
    print(*group)

Время: O(n log n + m log m). Память: O(n + m).