← Все истории
2002

«Лучший алгоритм на свете»: бинарный поиск и золото IOI

Мой тренер Сергей Мельник — очень хороший учитель — прямо настаивал на одном алгоритме. Запомните его, говорил он, он лучше всех: находит точно, работает чётко и быстро. Это был бинарный поиск — вариант, который находит самую левую позицию:

function binary_search_leftmost(A, n, T):
    L := 0
    R := n
    while L < R:
        m := floor((L + R) / 2)
        if A[m] < T:
            L := m + 1
        else:
            R := m
    return L

Я его не просто выучил — я его полюбил: разобрался, почему он работает и где у него границы. Именно на этом большинство и ошибается в бинарном поиске: плюс-минус единица, бесконечный цикл, не та сторона от искомого.

На Международной олимпиаде по информатике 2002 года ровно этого требовала задача Two Rods («Две палочки»). На сетке спрятаны две палочки — горизонтальная и вертикальная, — и найти их можно, только спрашивая, задевает ли их заданный прямоугольник. Решение — бинарный поиск несколько раз подряд: в одну сторону и в другую, по строкам и по столбцам. Я чётко взял за неё 100 баллов.

Команда Латвии на IOI 2002 в Корее

Йонъин, Корея, 2002: трое из четырёх участников команды Латвии — Александр Белов, Сергей Козлович и я (справа).

На олимпиаде можно было заказывать распечатки своих программ, чтобы сидеть и думать с бумажкой и ручкой. Я распечатал это решение, написал на нём «Спасибо Сергею Мельнику за этот алгоритм, который мы учили», привёз в Ригу и подарил ему.

Двадцать лет спустя я выложил его с одной подписью: best algorithm ever.

Приём призёров олимпиад после IOI 2002

Снова в Риге: приём латвийских призёров международных олимпиад после IOI 2002.

Поздравление мэра Риги, 2002

2002 год: поздравление мэра Риги Гундарса Боярса.