Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

Обласна олімпіада 2025 (розбір) | Статті

A. Дивна шеренга

Одноцифрові числа (09) завжди дивні, а багатоцифрові числа, що є паліндромами, містять повтори.

Якщо n<10, тоді відповідь рівна n+1, інакше — 10.

В. Алфавітна послідовність

Розділимо масив на зростаючі послідовності. Для цього перебираємо шеренгу: якщо s[i+1]>s[i], продовжуємо послідовність, інакше — починаємо нову послідовність.

Відповідь на задачу рівна максимальній довжині з усіх утворених послідовностей.

C. Гарна шеренга

Шеренга з k коней є гарною, якщо її множина номерів рівна {1,2,,k}. Тоді кількість таких шеренг дорівнює k!, а відповідь — nk=1k!.

Зауважимо, що для k>m маємо k!0(modm). Тому, якщо n>m суму можна обчислити для k=1,,m.

Відповіддю буде результат такої суми: k=1min.

D. Відгадай шеренгу

Нехай s — зафіксована шеренга коней довжини n. Розгл’янемо всі можливі рядки з n символів (від a до z) впорядковані лексикографічно від мінімального L = \mathtt{a\ldots a} до максимального R = \mathtt{z\ldots z}.

За допомогою бінарного пошуку по цьому відрізку, використовуючи відповіді:

  • = — рядок вгадано,

  • < — наша спроба менша за s,

  • > — наша спроба більша за s,

можна знайти s за O(n \cdot \log 26) запитів, що гарантує не більше 1000 спроб.

Для розв’язку необхідно трактувати рядки як числа в системі числення з основою 26 і реалізувати операції додавання і ділення на 2 в стовпчик. Також можна скористатись вбудованою в Python, C# або Java довгою арифметикою, вибрати межі для двійкового пошуку: L = 0, R = 26^n - 1 і перед виводом переводити числа в систему числення з основою 26.

E. Мiшки з вiвсом

Розглянемо декілька важливих фактів для розв’язку:

  • Для довільної групи коней з вагами a_{i_1}, a_{i_2}, \dots, a_{i_k} мінімальна кількість ходів для приведення їх до одного значення дорівнює \sum_{j=1}^{k} |a_{i_j} - x|, де оптимальне x — медіана цієї групи.

  • Оптимальну групу з k коней можна вибрати як підрядок відсортованого масиву. Тобто, після сортування масиву a отримуємо b_1 \le b_2 \le \dots \le b_n.

Використавши ці факти можна зробити такий розв’язок:

  1. Відсортувати масив a за неспаданням: b_1, b_2, \dots, b_n.

  2. За допомогою префіксних сум обчислимо суму елементів для швидкого підрахунку вартості перетворення.

  3. Для кожного підрядка довжини k (тобто для кожного i від 1 до n-k+1):

    • Нехай медіаною є b_{m}, де m = i + \lfloor \frac{k-1}{2} \rfloor (для парного k можна обрати будь-який із середніх).

    • Обчислити вартість перетворення: \text{cost} = \left( b_m \cdot (m-i) - (P_{m-1} - P_{i-1}) \right) + \left( (P_{i+k-1} - P_m) - b_m \cdot (i+k-m-1) \right), де P_j = \sum_{t=1}^{j} b_t — префіксна сума, а P_0 = 0.

  4. Відповіддю буде мінімальна знайдена вартість серед усіх можливих підрядків.

F. Кінські команди

Розглянемо розв’язок для n \le 2 \cdot 10^3. Нехай dp[i] — відповідь на задачі для масиву a_1, \dots, a_{i}, dp[0] = 0. Тепер ми можемо перебрати індекс найправішого видаленого числа j та оновити dp[i] значенням dp[j - 1] + (a_{j + 1} \oplus a_{j + 2} \oplus\dots \oplus a_i). Таку динаміку можна порахувати за O(n^2).

Для того ж щоб здати задачу на повний бал необхідно здогадатись, що оптимально аби між видаленими елементами було не більше ніж 2 \cdot \log_2 A, де A — це максимально допустиме значення в масиві. При заданих обмеженнях достатньо перевірити щонайбільше 60 варіантів який елемент буде найправішим видаленим .

G. Зустрiч на iподромi

Оскільки з кожної ділянки виходить рівно одна доріжка, отримуємо функціональний граф. Кожна компонента такого графа складається з циклу, до якого «притікають» вершини, що знаходяться поза циклом.

Нехай для кожної ділянки u ми обчислили:

  • d(u) — мінімальну кількість ходів від u до входу в цикл (тобто до першої вершини, що повторюється);

  • \mathit{id}(u) — ідентифікатор компоненти, до якої належить u;

  • p(u) — позицію вершини u на циклі (якщо u вже в циклі).

За умовою, кожен кінь може за одну хвилину або залишитися на місці, або пройти за своєю єдиною доріжкою. Тому, якщо кінь стартує з u, то він може потрапити у вершину f^t(u) за t ходів, а завдяки можливості чекати — залишатися в цій же вершині будь-який час після t.

Розглянемо запит із початковими ділянками u та v :

  1. Якщо \mathit{id}(u) \neq \mathit{id}(v), їхні шляхи не перетнуться, тому відповідь -1.

  2. Якщо f^{d(u)}(u) = f^{d(v)}(v) то зустріч відбудеться у деревовидній частині, а саме у найнижчому спільному предок вершин u та v.

  3. Якщо ж жодна з попередніх умов не виконується, то коні зустрінуться на циклі. Можна показати, що оптимальне місце зустрічі буде або у вершині f^{d(u)}(u) або f^{d(v)}(v).