Квадрати узвраћају ударац
Аутор: Алекса Милисављевић
Текст и тест примери: Алекса Милисављевић
Анализа решења: Алекса Милојевић
Тестирање: Владимир Миленковић
Подзадатак 1
У овом подзадатку сваке две тачке могу формирати квадрат описан у задатку, па треба избројати број свих парова тачака. Одговор је \frac{N(N-1)}{2}.
Подзадатак 2
Није тешко приметити да тачке (x_1, y_1) и (x_2, y_2) могу бити доње лево и горње десно теме квадрата чије су странице паралелне осама ако и само ако дуж која спаја ове две тачке гради угао од 45 степени са x осом у позитивном смеру (тј. паралелна је правој y=x у координатном систему). Ако претворимо изразимо овај услов помоћу координата, видимо да описани квадрат постоји ако и само ако важи x_1-y_1=x_2-y_2.
Дакле, неопходно је израчунати број парова тачака \{(x_i, y_i), (x_j, y_j)\} датог скупа за које важи x_i-y_i=x_j-y_j. Да бисмо ово ефикасно урадили, имамо више приступа. Да бисмо решили овај подзадатак, није неопходно бити превише пажљив, па за сваки пар тачака можемо проверити да ли важи дати услов. Сложеност овог решења је O(N^2).
Подзадатак 3
У овом подзадатку морамо пажљивије избројати парове за које важи горњи услов. Довољно је направити матрицу A димензија 1001\times 1001 такву да A_{i, j}=1 ако и само ако је тачка (i, j) у скупу задатих тачака, где су i, j=0, 1, \dots, 1000. Тада, за сваку могућу вредност x_i-y_i, можемо избројати колико се тачака налази на одговарајућој дијагонали матрице. Нека је за дијагоналу са x_i-y_i=t овај број једнак k_t. Тада је одговор \sum_{t=-1000}^{1000}\frac{k_t(k_t-1)}{2}.
Алтернативно, не морамо формирати матрицу, већ је довољно да за сваку могућу разлику x_i-y_i прођемо кроз све тачке скупа, за сваку од њих проверавајући да ли има одговарају разлику координата, и на тај начин одредимо број k_t. Одговор је исти као и у претходном пасусу. Сложеност овог приступа је O(\max\{|x_i-y_i|\}\times N).
Подзадатак 4
У овом делу задатка морамо ефикасно одредити бројеве k_t дефинисане горе. Ово можемо урадити сортирајући низ тачака по разлици x_i-y_i, а затим проласком кроз низ утврдити колико тачака међусобно има исту разлику x_i-y_i (при чему није од нарочитог значаја конкретна вредност те разлике). Одговор је исти као и у претходном подзадатку.
Смернице за имплементацију
Због величине бројева у задатку (а и потенцијалне величине одговора), потребно је користити 64-битне бројеве, да не би дошло до прекорачења и погрешног одговора.