Лаж
Аутор: Павле Мартиновић
Текст и тест примери: Тадија Шебез
Тестирање: Павле Мартиновић
Анализа решења: Младен Пузић
Решење када q = 2000
Овај подзадатак је ту за такмичаре који на неоптималан начин искуцају решење из следећег подзадатка.
Решење када q = 1000
Можемо да сазнамо да ли је неко лажов или истинољубац са само једним питањем. Ако особа x питамо за скуп \{x, y\}, где је y било која друга особа, сазнаћемо да ли је y лажов или истинољубац (само уколико каже да у њему има непарно лажова, онда је особа y лажов). Ово знамо, јер ако особа x говори истину, онда одговор зависи само од тога да ли је y лажов. Ако лаже, и ако су обојица лажови, x ће још увек рећи да је непарно лажова. У супротном, рећи ће да има непарно лажова.
Сад можемо проћи кроз низ и за сваку особу сазнати да ли је истинољубац или лажов са по једним питањем.
Решење када q = 30 и постоји тачно један лажов
Користећи идеју из претходног подзадатка, одредимо да ли је особа 1 истинољубац или лажов. Уколико је лажов, можемо вратити његов индекс, у супротном, можемо га користити да сазнамо информације о осталим људима.
Ако је истинољубац, онда је лажов нека од особа на интервалу [2, N]. Поделимо овај интервал на пола. Лажов се мора налазити у једној од те две половине. Питајмо особу 1 да ли је лажов у првој половини. Уколико јесте, даље разматрамо само њу, у супротном, разматрамо само другу половину.
Овом методом налик на бинарну претрагу, можемо наћи лажова са још десетак питања.
Решење када q = 30 и постоји непарно лажова
Слично претходном подзадатку, прво налазимо информацију о особи 1. Након тога, поново радимо бинарну претрагу на интервалу [2, N]. Овај пут, уместо да одржавамо само једног лажова, желимо да интервал који посматрамо увек има непаран број лажова. Када поделимо интервал који има непаран број лажова на две половине, једна половина имаће паран број лажова, а друга непаран. Претрагу настављамо у оној половини која има непаран број. Тако радимо док не дођемо до једног лажова.
Главно решење
Последњи подзадатак решавамо као претходни, само што је прво потребно да нађемо неки подскуп људи у којем има непарно лажова. То можемо урадити насумичним (рандомизираним) приступом.
Сваки елемент убацујемо у наш подскуп са вероватноћом 50\%. Самим тим, вероватноћа да ће тај подскуп имати непарно лажова је такође 50\%. Уколико подскуп који смо добили има парно много лажова, онда конструишемо нови подскуп, док не добијемо неки који нам одговара.
Вероватноћа да ће нам за то требати преко 19 покушаја је јако мала, \frac{1}{2^{19}}, па је можемо занемарити. Остала питања можемо искористити на други део решења, где опет радимо нешто налик на бинарну претрагу, само овај пут делимо скуп на два, уместо интервал.