A301. Количество точек в полукругах

Задача

Даны действительные числа x_1, y_1, x_2, y_2, \ldots, x_{20}, y_{20}, r_1, r_2, \ldots, r_{11}, \left( 0 < r_1 < r_2 < \ldots < r_{11} \right). Пары \left( x_1, y_1 \right), \left( x_2, y_2 \right), \ldots \left( x_{20}, y_{20} \right) рассматриваются как координаты точек плоскости. Числа r_1, r_2, \ldots, r_{11} рассматриваются как радиусы одиннадцати полукругов в полуплоскости y > 0 с центром в начале координат. Найти количество точек, попадающих внутрь каждого полукруга (границы-полуокружности не принадлежат полукругам).

Примечание: будем рассматривать задачу с произвольным количеством точек n и полуокружностей m.

Входные данные

n, m, x_i, y_i, i = \overline{1, n}, r_j, j = \overline{1, m}

Выходные данные

a_j — количество точек в j-том полукруге, j = \overline{1, m}.

Тест

Входные данные Выходные данные
20 11

14 4
5 -4
4 90
2 4.91
8 9.0
8.3 4.111
20 49.0
0 301.419
8.01 34.5
2.1 -49.1
0.01 0.03
56 1.91
4.04918 34.49294
-1.85892 5.01674
51 214
14.94 44.09
41.4 -154
-581.49 495
14.39 -81.682
77 194.4
0.3
20.82
50.9
51
65.845
90.37
109.58
170.83
217
301.58901
314

1
6
9
9
11
12
12
12
13
15
15

Код программы

Решение задачи

Из входного потока считываем координаты всех точек, и отсеиваем из них те, у которых координата y \le 0, так как они по условию не могут принадлежать данным полуокружностям, остальные же добавляем в вектор точек dots. После этого, создаём два массива: первый rads — массив радиусов — считываем из входного потока, второй amounts — обнуляем. В i-ой ячейке массива amounts будем хранить количество точек, которые принадлежат i-тому, и большим чем он полукругам. После этого, используя алгоритм бинарного поиска, находим наименьший полукруг, который содержит точку, и запоминаем его номер. Затем количество точек, содержащихся в данном и больших, чем данный полукругах, увеличиваем на единицу.

После обработки вектора точек, массив amounts преобразуем в массив количеств точек, содержащихся в конкретных полукругах, так как до этой обработки он содержит количество точек, которые «аккумулированы» i-тым, и большими чем i-тый полукруги.

Таким образом, общая асимптотика программы составит O \left(m+n \cdot \log_{2}{m}\right), где n — количество точек, а m — полукругов.

Ссылки