Редакция для Все элементы различны


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

1. Идея

Нужно проверить, встречается ли в последовательности хотя бы одно число больше одного раза.

Самая удобная мысль: если поместить все элементы в множество, то в множестве каждый элемент хранится только один раз.
Значит:

  • если все элементы были различны, размер множества будет равен n;
  • если были повторы, размер множества окажется меньше n.

Остаётся сравнить len(set(a)) или s.size() с n.


2. Наблюдения

  1. Повторы удобно искать не попарным сравнением, а через структуру данных, которая хранит только уникальные элементы.
  2. Множество автоматически "склеивает" одинаковые значения.
  3. Ограничение n <= 2 * 10^5 намекает, что решение O(n^2) слишком медленное.
  4. Использование множества даёт среднюю сложность O(n), что подходит.

Пример:

  • последовательность 1 5 7 9
    множество будет {1, 5, 7, 9}, размер 4, значит ответ YES.

  • последовательность 3 8 3 10
    множество будет {3, 8, 10}, размер 3, хотя n = 4, значит ответ NO.


3. Алгоритм

  1. Считать n.
  2. Считать n чисел.
  3. Поместить их в множество.
  4. Сравнить размер множества с n.
  5. Если размеры равны, вывести YES, иначе NO.

4. Почему это работает

Множество содержит каждый элемент не более одного раза.

Рассмотрим два случая:

  • Если все числа в массиве различны, то каждое из n чисел попадёт в множество как новый элемент. Тогда размер множества станет ровно n.
  • Если хотя бы одно число повторяется, то при добавлении одинаковых значений множество сохранит только одну копию. Значит число различных элементов будет меньше n, и размер множества окажется меньше n.

Таким образом, условие размер множества == n эквивалентно условию "все элементы различны".
Следовательно, алгоритм всегда даёт правильный ответ.


5. Сложность

  • Время: O(n) в среднем.
  • Память: O(n).

6. Код на C++17

#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

int main() {
    int n;
    cin >> n;

    unordered_set<long long> s;
    for (int i = 0; i < n; i++) {
        long long x;
        cin >> x;
        s.insert(x);
    }

    if ((int)s.size() == n) {
        cout << "YES\n";
    } else {
        cout << "NO\n";
    }

    return 0;
}

7. Код на Python 3

n = int(input())
a = list(map(int, input().split()))

if len(set(a)) == n:
    print("YES")
else:
    print("NO")

Комментарии

Еще нет ни одного комментария.