Конвексни скоро омотач
Аутор: Немања Мајски
Текст и тест примери: Немања Мајски
Анализа решења: Немања Мајски
Тестирање: Александар Вишњић
Рачунање површине:
Површину неког конвексног моноугла можемо израчунати тако што га поделимо на троуглове, израчунамо површине тих троуглова и саберемо их. Важно је да површину рачунамо користећи само целе бројеве. Препорука је да се то ради преко векторког производа. Ако се користи нпр. Херонова формула, дешавају се грешке у прецизности, због чега програм неће дати тачан резултат.
Решење када је N=4:
Приметимо да је проблем исто што и склањање једне тачке и затим тражење минималног конвексног омотача осталих тачака. Из тога следи да ће конвексни скоро омотач бити троугао који има 3 од дате 4 тачке. Тако да можемо проверити све троуглове и исписати најмању од њихових површина.
Решење када је N \le 500:
Приметимо да како бисмо нашли конвексни скоро-омотач можемо да итерирамо кроз тачку коју избацујемо и да нађемо конвексни омотач осталих тачака. Такав омотач са најмањом површином је конвексни скоро-омотач.
За налажење конвексног омотача можемо користити алгоритам у сложености O(N^2). На пример Jarvis march
алгоритам.
Временска сложеност је O(N^3), а меморијска O(N).
Решење када је N \le 2000:
Користимо решење из претходног подзадатка, само што користимо ефикаснији алгоритам за налажење конвексног омотача. Можемо на пример користити Graham scan
који ради у времеској сложености O(N log N).
Временска сложеност је O(N^2 log N), а меморијска O(N).
Решење када је број страница конвексног омотача највише 10:
Радимо алгоритам из претходног подзадатка. Но, приметимо да када се склони тачка која се не налази на ивици конвексног омотача (односно није његово теме), онда њено склањање не мења површину конвексног омотача осталих тачака. Тако да можемо на почетку наћи конвексни омотач и онда имамо само 10 тачака чије избацивање треба да проверимо.
Временска сложеност је O(\alpha \cdot N log N), а меморијска O(N), где \alpha представља број темена конвексног омотача.
Решење када су тачке темена конвексног $N-$тоугла:
Итерирамо по тачки коју избацујемо. Нека је то тачка A и нека су њени суседи B и C. Приметимо да ће конвексни омотач бити исти, сем што после тачке B неће долазити тачка A него тачка C. Тако да ће његова површина бити једнака површини почетног моноугла умањеној за површину троугла ABC.
Ако израчунамо површину оригиналног моноугла и одузмемо површину највећег троугла који чине 3 суседне тачке, нашли смо површину конвексног скоро-омотача.
Временска и меморијска сложеност је O(N).
Решење када је број страница конвексног омотача најмање N - 100:
Нађимо конвексни омотач свих тачака. Над њиме примењујемо алгоритам из претходног подзадатка. Проблем је ако се у троуглу ABC налазе неке тачке.
Тада конвексни омотач неће ићи од тачке B до тачке C, већ ће садржати и неке тачке које се налазе у троуглу ABC. Да бисмо нашли за колико се смањи површина склањањем тачке A, морамо од површине троугла ABC одузети површину конвексног омотача скупа тачака који чине тачке B, C и тачке унутар троугла ABC (без тачке A).
Како је број тачака које се налазе ван конвексног омотача мали, можемо да прођемо кроз све и нађемо које припадају троуглу ABC. Такође, прављење тих N конвексних омотача ће такође бити доста брзо, пошто се свака тачка налази у највише 2 таква троугла.
Временска сложеност је O(\alpha \cdot N + N log N), а меморијска O(N), где \alpha представља број тачака које се не налазе на конвексном омотачу.
Главно решење
Уколико се јако пуно тачака не налази на конвексном омотачу, преспоро је О(N) пута проверавати сваку да ли се налази у троуглу. Посебно пошто се углавном и не налази.
Нека су координате тачака троугла ABC редом (x_1,y_1),(x_2,y_2),(x_3,y_3). Онда да би нека тачка (x, y) припадала троуглу ABC, мора да важи:
min(x_1, x_2, x_3) \le x \le max(x_1, x_2, x_3)
Ако тачке оригинално сортирамо по x координати, онда је налажење свих таквих тачака лако користећи бинарну претрагу. Онда за све такве тачке проверимо да ли су у троуглу.
Како је конвексни омотач конвексан моноугао, то значи да га свака права сече у највише 2 тачке. Из тога следи да ће уз оптимизајицу горе свака тачка бити проверена највише 4 пута да ли је у неком троуглу, па ће бити највише 4 \cdot N провера.
Временска сложеност је O(N log N), а меморијска O(N).