Кубики
Вы решили задачу. Теперь можно сравнить подходы.
Пересечение и две разности множеств описывают требуемые группы.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Операции над множествами
Пересечение даёт общие цвета, направленные разности — уникальные для каждого ребёнка.
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).
На что обратить внимание
- Выводите сначала общие цвета, затем только Ани, затем только Бори.
- Даже для пустой группы нужно вывести количество 0.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.