Слишком близкие результаты

тема: Два указателя · уровень: средний

Условие

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

Результат каждого участника — целое число (например, время в миллисекундах). Пара участников считается «почти одинаковой», если разница их результатов не больше D.

Посчитайте, сколько существует пар участников (i, j), где i < j, таких что |a[i] - a[j]| ≤ D.

Важно: значения и ответ могут не помещаться в 32-битный тип (как на олимпиадах), используйте 64-битную арифметику. В Python это уже учтено.

Формат ввода

В первой строке записаны два целых числа n и D. Во второй строке записаны n целых чисел a1, a2, ..., an — результаты участников.

Формат вывода

Выведите одно целое число — количество пар (i, j), i < j, для которых |ai - aj| ≤ D.

Ограничения

Пример

Ввод:

5 3
1 2 10 4 7

Вывод:

5

Подходящие пары по значениям: (1,2), (1,4), (2,4), (4,7), (7,10).

Как решать — идея подхода

Приём: Сортировка + два указателя

Ключевое наблюдение: условие |a[i] - a[j]| ≤ D неудобно в исходном порядке, но после сортировки всё упрощается. Если a отсортирован, то для i < j разность просто a[j] - a[i] (она уже неотрицательная), и для фиксированного i подходят подряд идущие j: как только разница стала больше D, дальше (при большем j) она уже не уменьшится.

Здесь работает приём «два указателя» (скользящее окно): правая граница j никогда не двигается назад, поэтому общий проход получается линейным.

План:

Сложность: сортировка O(n log n) и один линейный проход O(n), память O(1) сверх массива.

Частая ошибка: сбрасывать j в i+1 на каждом шаге без max(...) или двигать j назад — это легко превращает решение в O(n^2).

Разберись руками

Есть 5 результатов: 1, 2, 10, 4, 7. Разница считается «почти одинаковой», если она не больше 3. На этом примере руками найдём все подходящие пары через два указателя.

Идея: Отсортируй результаты. Держи два указателя: левый перебирает элементы по очереди, а правый уходит вправо настолько далеко, насколько ещё сохраняется «разница не больше нужного числа». Для каждого левого указателя добавляй к ответу, сколько правых позиций подошло, и не возвращай правый указатель назад.

Решить задачу с автопроверкой на Python →

Куда дальше