Копії без оригіналів#544

Розв’язок

Простежимо, з якої початкової картки походить вміст кожної картки.

Нехай p_i — номер початкової картки, вміст якої зараз міститься на картці . Спочатку p_i=i. Під час операції достатньо присвоїти p_y=p_x. Самі початкові числа для цього знати не потрібно.

Після виконання всіх операцій число a_i мало бути записане спочатку на картці p_i. Отже, якщо p_i=p_j, але a_i\ne a_j, заданий кінцевий вміст неможливий і відповідь дорівнює .

Для перевірки заведемо масив із нулів. Значення b_j=0 означатиме, що вимог до початкового вмісту картки ще немає. Це зручно, оскільки всі задані числа додатні.

Переберемо картки від до . Якщо b_{p_i}=0, запишемо b_{p_i}=a_i і збільшимо відповідь на один. Якщо b_{p_i}\ne 0, перевіримо, що b_{p_i}=a_i. У разі невідповідності виведемо .

Якщо суперечностей немає, відповідь дорівнює кількості різних значень серед p_1, p_2, \ldots, p_n.

Доведення правильності

Спочатку значення p_i=i правильно вказує на джерело вмісту картки . Копіювання з на змінює джерело вмісту картки на джерело вмісту картки . Тому присвоєння p_y=p_x зберігає правильність усіх значень p_i після кожної операції.

Якщо дві кінцеві картки походять з однієї початкової картки, їхній вміст має бути однаковим. Отже, кожна знайдена алгоритмом суперечність справді означає, що заданий кінцевий вміст неможливий.

Якщо суперечностей немає, кожна початкова картка, номер якої зустрічається серед значень p_i, обов’язково має бути непорожньою: від неї походить хоча б одна непорожня кінцева картка. Тому відповідь не може бути меншою за кількість таких карток.

Запишемо на кожній із них відповідне число b_j, а всі інші початкові картки залишимо порожніми. Після всіх операцій картка міститиме число b_{p_i}=a_i. Так ми отримаємо потрібний вміст із найменшою можливою кількістю непорожніх карток на початку.

Складність

Кожну операцію та кожну картку опрацьовуємо за сталий час. Часова складність — O(n+m), додаткова пам’ять — . Операції можна опрацьовувати одразу під час зчитування.