[Линия дерева] [математические] [дискретные] Luogu P2928 крупного рогатого скота головорезы

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); 
}
Просмотр кода

 

рекомендация

отwww.cnblogs.com/mastervan/p/11123382.html