Gate logo

Gate

ГлавнаяКонтестыМастерскаяО платформе
Войти

Пройдет ли решение по времени? Просто о скорости кода

DR

dragon286

26.11.2025

Вы написали решение, отправили его, а система выдала TL (Time Limit Exceeded). Это значит, программа работала слишком долго. Обычно лимит времени на задачу это ~1 секунда. За это время компьютер успевает сделать примерно 10810^8108 операций.

Чтобы не тратить время на заведомо медленные решения, нужно уметь оценивать их скорость. В программировании это называют оценкой асимптотики и записывают через O(⋯ )O(\cdots)O(⋯). Она показывает порядок количества операций в зависимости от размера входных данных NNN. Асимптотика описывает только скорость роста нагрузки. O(N)O(N)O(N) значит, что время растет прямо пропорционально данным. При этом количество действий на один элемент может быть разным (это называют константой), но если оно не зависит от NNN, сложность всё равно остается линейной.

Примеры операций и их стоимость в простейших операциях

  • Доступ к элементу массива: O(1)O(1)O(1) — одно чтение памяти в ячейке.
  • Бинпоиск / set / map: O(log⁡N)O(\log N)O(logN) log⁡N\log NlogN сравнений/операций. Растет очень медленно. Для N=105N=10^5N=105 это всего ~18 операций.
  • Сортировка массива: O(Nlog⁡N)O(N \log N)O(NlogN) — Nlog⁡NN \log NNlogN сравнений. Самый частый случай.
  • Дерево отрезков (Segment Tree): Построение O(N)O(N)O(N), запрос/обновление O(log⁡N)O(\log N)O(logN).
  • Поиск делителей числа: O(N)O(\sqrt N)O(N​) — N\sqrt NN​ операций деления (проход до корня).
  • Вложенный цикл: O(N2)O(N^2)O(N2) — N2N^2N2 операций. Слишком медленно для больших NNN.

Пример: N=105N = 10^5N=105

Допустим, нам дан массив из 10510^5105 чисел.

  1. Быстро: O(N)O(N)O(N). Один проход по массиву. 10510^5105 операций. Мгновенно.
  2. Тоже быстро: O(Nlog⁡N)O(N \log N)O(NlogN). Сортировка. 105×17≈1.7⋅10610^5 \times 17 \approx 1.7 \cdot 10^6105×17≈1.7⋅106 операций. Легко укладывается в секунду.
  3. Медленно: O(N2)O(N^2)O(N2). Вложенные циклы. (105)2=1010(10^5)^2 = 10^{10}(105)2=1010 операций. Это ≈100\approx 100≈100 секунд. Вердикт TL.

Шпаргалка

Смотрите на максимальное NNN в условии задачи:

  • N≤106N \le 10^6N≤106: Нельзя вложенные циклы. Только линейное решение O(N)O(N)O(N) или сортировка O(Nlog⁡N)O(N \log N)O(NlogN).
  • N≤5000N \le 5000N≤5000: Можно вложенные циклы O(N2)O(N^2)O(N2).
  • N≤500N \le 500N≤500: Можно кубическую сложность O(N3)O(N^3)O(N3) (например, алгоритм Флойда).
  • N≤20N \le 20N≤20: Можно перебор O(2N)O(2^N)O(2N).

Главное правило: прикиньте число операций. Если оно больше 10810^8108 — ищите другой алгоритм. Это сэкономит кучу времени на контестах!

© 2025 gate149 inc. Все права защищены.

Политика конфиденциальности