Редакция для Все элементы различны
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.
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно проверить, встречается ли в последовательности хотя бы одно число больше одного раза.
Самая удобная мысль: если поместить все элементы в множество, то в множестве каждый элемент хранится только один раз.
Значит:
- если все элементы были различны, размер множества будет равен
n; - если были повторы, размер множества окажется меньше
n.
Остаётся сравнить len(set(a)) или s.size() с n.
2. Наблюдения
- Повторы удобно искать не попарным сравнением, а через структуру данных, которая хранит только уникальные элементы.
- Множество автоматически "склеивает" одинаковые значения.
- Ограничение
n <= 2 * 10^5намекает, что решениеO(n^2)слишком медленное. - Использование множества даёт среднюю сложность
O(n), что подходит.
Пример:
последовательность
1 5 7 9
множество будет{1, 5, 7, 9}, размер4, значит ответYES.последовательность
3 8 3 10
множество будет{3, 8, 10}, размер3, хотяn = 4, значит ответNO.
3. Алгоритм
- Считать
n. - Считать
nчисел. - Поместить их в множество.
- Сравнить размер множества с
n. - Если размеры равны, вывести
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")
Комментарии