Bug2#2259

Bug2

3 секунди
256 мегабайтів
Складна

Існує багато навігаційних задач навколо нас. Це задача про алгоритм під назвою Bug2.

Bug-алгоритми розв'язують таку навігаційну задачу. Дано двовимірну карту з перешкодами довільної форми, а також початкову і кінцеву точки. Також є агент, який спочатку знаходиться у точці , і його завдання — дістатися у точку фінішу . Він знає координати фінішної точки, і в будь-який момент часу може визначити власні координати. Агент має пам'яті, тому не може зберігати карту перешкод. Єдиний спосіб отримати інформацію про зовнішній світ — це визначати, чи торкається він перешкоди. Агент здатен рухатися навколо перешкоди, слідуючи по її межі. Задача полягає в тому, щоб дістатися фінішної точки, якщо це можливо, і коректно повідомити про недосяжність в іншому випадку.

Алгоритм Bug2, який належить до сімейства Bug-алгоритмів, працює так:

1. Рухатися в напрямку , поки не відбудеться одна з наступних подій:

2. Визначити поточну точку як . Рухатися по межі перешкоди за годинниковою стрілкою, поки не відбудеться одна з наступних подій:

Можна довести коректність алгоритму: тобто, він досягає фінішної точки за скінченний час (тобто, довжина отриманого шляху скінчена), якщо це можливо, і повідомляє про недосяжність фінішу також за скінченний час.

Дано набір багатокутних перешкод, а також початкову і фінішну точку. Визначте довжину шляху, який пройде агент під керуванням алгоритму Bug2.

Вхідні дані

У першому рядку вхідного файлу записано п'ять цілих чисел , x_S, y_S, x_F, y_F — кількість перешкод та координати початкової і фінішної точок.

Далі у вхідному файлі описуються перешкоди. Кожен опис починається з рядка з одним цілим числом (m \ge 3) — кількість вершин у перешкоді. Наступні рядків містять пари цілих чисел x_i, y_i — координати вершин перешкоди, подані за годинниковою стрілкою. Перешкода не має самоперетинань або самонадкриттів.

Загальна кількість вершин усіх перешкод не перевищує . Жодна координата за модулем не перевищує 10^6.

Жодна вершина перешкоди не лежить на прямій . Обидві точки старту та фінішу лежать строго поза всіма перешкодами. Жодні дві перешкоди не мають спільних точок. Якщо існують дві точки і , де межі перешкод перетинають пряму , то виконується або |\textbf{AF}| = |\textbf{BF}|, або ||\textbf{AF}|-|\textbf{BF}|| > 10^{-6}.

Вихідні дані

Виведіть довжину шляху, що проходить агент під керуванням описаного алгоритму. Допускається абсолютна або відносна похибка 10^{-6}.

Приклади

Приклад 1

Loading
Loading