https://www.luogu.org/problemnew/show/P2928
анализ
Очень интересный вопрос мышление
Поскольку все точки находятся в движении, мы не изменить относительное движение
Установить Бесси (0,0), не пользуются дома, убийцы параметров по сравнению (х-Ьх, у-на, ух-VBX, уу-VBY)
Таким образом, субъект становится убийцей, когда стремится войти или касательной к г радиус окружности с центром в начале координат
Вы можете иметь уравнение:
$ R ^ 2 = (х + TVx) ^ 2 + (у + TVY) ^ 2 $
В обычном стиле
$ (Ух ^ 2 + уу ^ 2) т ^ 2 + 2 * (х \ CDOT ух + у \ CDOT уу) т + х ^ 2 + у ^ 2-г ^ 2 = 0 $
Затем решить уравнение, два решения в матрицу памяти, дискретное упорядочение
Возьмите дерево сегмента может быть полным ответом
Примечание:
1, если нет смысла в относительном движении движения, определяет , следует ли быть в пределах круга или
2, не приговорить никакого решения, решение меньше , чем 0, и т.д.
#include <iostream> #include <cstdio> #include <CMATH> #include <алгоритм> с помощью пространства имен STD; ЬурейеЕ двойной дб; Const INT N = 5e4 + 10 ; структура Корова { дб х, у, Vx, Vy; недействительные В () {зсап ( " % Л.Ф.% Л.Ф.% Л.Ф.% ЛФ " , & х, & у, & ое, & уу);} Коровы оператор - (& Корова б) { возвращение (корова) {xb.x, yb.y , VX-b.vx, vy- b.vy}; } } Т, а [N]; INT S [N << 3 ],3 ], R = 1 ; INT НКТ; дБ р [ 2 * N], Q [N] , [ 2 ]; INT п, г, ANS, е; недействительный Calc ( INT х) { дБ А = пау (а [х] .vx, 2 ) + пау (а [х] .vy, 2 ), B = 2 * а [х] .x * а [х]. ух + 2 * а [х] .y * а [х] .vy, С = пау (а [х] .x, 2 ) + пау (а [х] .y, 2 ) -pow (г, 2 ); дБ дельта = пау (В, 2 ) - 4,0 * А * С; если (дельта < 0,0 )вернуться ; дБ d_root = SQRT (дельта); дБ x1 = (- 1,0 * В-d_root) / ( 2,0 * А), х2 = (- 1,0 * В + d_root) / ( 2,0 * А); если (x1 < 0,0 ) x1 = 0 ; если (х2 <= 0.0 ) возвращение ; р [ ++ CNT] = x1, 1 ; р [++ CNT] = х2, - 1 ; д [CNT >> 1 ] [ 0 ] = x1; д [CNT >> 1 ] [ 1 ] = x2; } Недействительными Pushdown (INT х) { S [х << 1 ] + = LZ [х]; LZ [х << 1 ] + = LZ [х]; с [(х << 1 ) + 1 ] + = LZ [х]; LZ [(х << 1 ) + 1 ] + = LZ [х]; LZ [х] = 0 ; } Недействительными Добавить ( INT х, INT л, INT г, INT L, INT R) { если (г <L || Р <л || г <л) возврата ; если (L <= L && г <= Р {) с [х] ++; LZ [х] ++ ; вернуть; } Pushdown (х); Int середине = L + R >> 1 ; если (L <= середина) Добавить (х << 1 , л, средний, L, R); если (середина <R) Добавить ((х << 1 ) + 1 , середина + 1 , R, L, R); с [х] = макс (ы [х << 1 ], с [(х << 1 ) + 1 ]); } INT основных () { зсапЕ ( " % d% d " , & п, & г); банка(); для ( INT I = 1 ; г <= п; я ++) а [я] .В (), а [I] = а [I] - т; для (Int я = 1 ; г <= п; я ++ ) , если (а [я] .vx =! 0 || а [я] .vy =! 0 ) Calc (I); остальное , если (POW (а [я] .x, 2 ) + пау (а [я] .y, 2 ) <= пау (г, 2 )) е ++ ; рода (р + 1 , р + CNT + 1 ); для ( INT I = 1 ; г <= (CNT >> 1 ); я ++ ) { INT л = lower_bound (р + 1 , р + CNT + 1 , д [I] [ 0 ]) - р, г = lower_bound (р + 1 , р + CNT +1 , д [я] [ 1 ]) - р; Добавить (Rt, 1 , CNT, L, R); } ANS = S [RT] + е; Е ( " % d " , ANS); }