Розбір
Автор задачі: | Антон Ципко |
Задачу підготував: | Станіслав Безкоровайний |
Розбір написав: | Станіслав Безкоровайний |
Примітка: На усіх ілюстрація до розв'язку вважатимемо, що .
Нехай базовим полем є таке поле, що у ньому є чорний прямокутник, такий, що його лівий нижній кінець має координати . Тобто, таке поле виглядатиме так:
Тоді будь-яке інше поле можна отримати за допомогою деякого зсуву базового поля. Наприклад, якщо зсунути його на 2 клітинки вліво і на 1 вгору, отримаємо такий малюнок:
Твердження. Всього різних полів . Усі види полів можна отримати зсунувши поле на деяке число вліво та деяке число вниз, де .
Якщо вас не цікавить доведення, перегорніть на сторінку, де буде описуватись сам розв'язок.
Доведення. Нехай у нас є деяке поле, і деяка точка на ньому. У цієї точки є координати . Тоді нехай трійка чисел — це її шахові координати, які формуются таким чином:
— дорівнює , якщо ця клітинка знаходиться в білому квадраті, і , якщо у чорному.
— відстань по осі від лівого нижнього кута прямокутника, в якому ця клітинка знаходиться.
— відстань по осі від лівого нижнього кута прямокутника, в якому ця клітинка знаходиться.
Якщо ми зафіксуємо деяку точку та знатимемо її шахові координати, то ми зможемо однозначно побудувати поле, дізнавшись координати лівого нижнього кута прямокутника, в якому ця клітинка знаходиться та колір цього прямокутника. Очевидно, що для деякої фіксованої точки для кожної трійки будуть різні поля.
Можливих значень — 2, — m, — n. Отже, всього різних полів .
Отже, ми знаємо, що всього полів . Для того, щоб довести друге тверждення достатньо довести, що при будь-якому зсуві поля на деяке число вліво та деяке число вниз, де , ми будемо отримувати різні поля.
Перше, що варто помітити, що при зсуванні поля на клітинок вліво і на вниз, шахові координати клітинок змінюються так само, як якби -координату збільшили на , а -координату на .
Зафіксуємо точку з шаховими координатами . Без обмеження загальності скажемо, що (клітинка у чорному прямокутнику). Також скажемо, що (ці випадки доводяться ще легше).
Тоді можливі такі випадки:
. Тоді ми будемо залишатись всередині одного прямокутника, отже шахові координаті будуть дорівювати .
. Тоді ми перейдемо в новий білий квадратик при зсуві вниз, і наші координати будуть
І т.д.... Продовжити цей список читачу на домашнє завдання =). В кінці маємо отримати всі можливі види шахових координат.
Для інтуїтивного розуміння ось ілюстрація (червоним виділено ті місця, в які ми можемо потрапити з точки при зсуві):
Можна бачити, як зі шматочків білих та чорних квадратиків, на які можна потрапити можна зібрати білий прямокутник та чорний прямокутник.
А тепер власне розв'язок:
Це була центральна лема цієї задачі. Ось, що треба зробити, щоб отримати бали за блоки:
Нагадаємо, що при зсуві поля на клітинок вліво та клітинок вниз, кольори клітинок змінюються также само, як і при додаванні до відповідних координат клітинок чисел і .
Блок 1
У першому блоці можна скласти велике поле, наприклад, , (двовимірний масив символів або чисел). І перевіряючи на цьому полі чи можна зсунути точку на кожен з можливих і , будемо рахувати кількість зсувів, які підходять для всіх точок.
Асимптотика , де — розмір вашого поля.
Розв'язок: https://pastebin.com/NWqwwG3B
Блок 2
Тепер ми будемо робити те саме, що у першому прикладі, але тепер замість того, щоб явно будувати поле, навчимося за шукати колір клітинки за її координатами.
Підсказка. Для того, що знайти колір клітинки за її координатами, варто вважати, що спочатку у нас базове поле. Також дуже зручно вважати, що координати клітинок починаються не з , а з . Спробуйте вивести формулу. Якщо не зможете, то погляньте на функцію у розв'язку.
Асимптотика .
Розв'язок: https://pastebin.com/2q72v6TL
Блок 3
У розв'язку третього блоку я буду вважати, що . Якщо це не так, то робимо аналогічно, але тепер знаходимо відрізки не для зсувів по вертикалі, а для зсувів по горизонталі.
Давайте для кожного зсуву точок вгору від 0 до знайдемо для кожної точки відрізки, які їй підходять. Ось наприклад, для точки з координатами , потрібним їй білим кольором та вертикальним зсувом 1, їй підходять такі зсуви вправо (світло-сірим виділено саму клітинку, червоним обведено можливі зсуви):
Потім окремо для кожного з вертикальних зсувів знаходимо множину таких зсувів по горизонталі, що підходять нам. Для цього можна використати scanline, щоб знайти множину таких точок, які покриваються відрізками. Зауважте, що це не перетин відрізків, бо для одного вертикального зсуву для точки може бути не один, а два відрізка.
Для тих, хто ніколи не використовував метод scanline, почитайте про нього більше тут: https://informatics.mccme.ru/mod/resource/view.php?id=39111
Сума кількістей таких точок для кожного з зсувів точок вгору і є нашою відповіддю.
Асимптотика .
Розв'язок: https://pastebin.com/w4TRJwu5
Блок 4
Якщо ми ще сильніше подивимось на ілюстрації, то зрозуміємо, що допустимі зсуви являють собою не випадковий набір відрізків, а прямокутнички, ось наприклад прямокутнички, для попередньої ілюстрації і для більшої зрозумілості, ілюстрація для випадку (координати і потрібний колір точки ті самі):
Тепер ми знову можемо використати scanline, але тепер замість того, щоб додавати в scanline точки, будемо додавати відрізки. Наша задача тепер знайти площу, яка покрита квадратиками.
Для того, щоб знаходити перетин відрізків у сканлайні вам знадобиться будь-яке збалансоване дерево пошуку. У мові програмування C++ для цього можна використати set
.
Асимптотика .
Розв'язок: https://pastebin.com/cpmL7TXX