[ツリーライン] [数学] [離散] luogu P2928牛暴漢

https://www.luogu.org/problemnew/show/P2928

分析

非常に興味深い質問を考え

すべての点が動いているので、我々は相対的な動きを変更しないでください

ベッシー(0,0)を設定し、(X-BX、Y-によって、VX-VBX、VY-vby)パラメータのキラーを比較、自宅で運動していません

そう主題は、入力またはrの接線しようとしているキラーは、原点を中心とする円の半径でなります

あなたは式を持つことができます。

$のR ^ 2 =(X + TVX)^ 2 +(Y + TVY)^ 2 $

従来のスタイルに

$(VX ^ 2 + VY ^ 2)T ^ 2 + 2 *(X \ CDOT VX + Y \のCDOTのVY)T + X ^ 2 + y ^ 2-R ^ 2 = 0 $

そして、方程式を解くため、メモリアレイに2つのソリューション、個別の発注

ツリーは、全解答することができ、セグメントを取ります

注意:

図1に示すように、動きの相対運動にはポイントが存在しない場合、円内またはれているか否かを判断する
解決策を宣告しないように、図2に示すように、溶液を等、0未満であります

 

#include <iostreamの> 
する#include <cstdioを> 
する#include <cmath> 
の#include <アルゴリズム>
 使用して 名前空間STDを、
typedefをダブルデシベル。
CONSTの INT N = 5E4 + 10 構造体牛{ 
    dBのX、Y、VX、VY。
    ボイドは(){scanf関数(" %LF%LF%LF%LF "、およびX&Y、&VX、及びVY);} 
    カウ演算子 - (牛&B){
         リターン(牛){xb.x、yb.y 、VX-b.vx、vy- b.vy}。
    } 
} T [N]。
INT S [N << 3 ]3 ]、RT = 1 int型のCNT; 
dBのP [ 2 * N]、Q [N] [ 2 ]。
int型ANS、R、N、E。

ボイド計算値(INT X){ 
    dBのA = POW([X] .vx、2)+ POW([X] .vy、2)、B = 2 * [X] .X * [X]。 VX + 2 * [X]・Y * [X] .vy、
    C = POW([X] .X、2)+ POW([X] .Y、2)-pow(R、2 )。
    DBデルタ = POW(B、2) - 4.0 * A * C。
    もし(デルタ< 0.0返します
    デシベルd_root = SQRT(デルタ)。
    DB×1 =( - 1.0 *のB-d_root)/(2.0 * A)、X2 =( - 1.0 * B + d_root)/(2.0 * A)。
    もし(X1 < 0.0)X1 = 0もし(X2 <= 0.0リターン; 
    P [ ++ CNTは】X1 = 1 ; P [++ CNTは】X2 = - 1 
    Q [CNT >> 1 ] [ 0 ]×1 =、Q [CNT >> 1 ] [ 1 ] = X2と、
} 

無効プッシュダウン(INT X){ 
    S [X << 1 ] + = LZ [X]; LZ [X << 1 ] + = LZ [X]。
    S [(X << 1)+ 1 ] + = LZ [X]; LZ [(X << 1)+ 1 ] + = LZ [X]。
    LZ [X] = 0 ; 
} 

ボイド追加(int型のx、int型の L、int型の R、int型の L、INT R){
     場合(R <L || R <L || R <L)のリターン;
    もし(L <= 1 && R <= R){ 
        S [X] ++; LZ [X] ++ ;
        リターン; 
    } 
    プッシュダウン(X)。
    INT半ば= L + R >> 1 もし(X <<追加する(L <= MID)1 、L、中間、L、R)。
    場合(MID <R)は((X <<追加1)+ 1、中間+ 1 、R、L、R)。
    S [X] = MAX(S [X << 1 ]、S [(X << 1)+ 1 ])。
} 

int型のmain(){ 
    scanf関数(" %D%dの"、&​​N、&R)。
    錫(); 
    int型 iは= 1 ; iが<= N; iが++)[I] .IN()、[i]は[I] = - Tを、
    以下のためのint型 I = 1を iが++; iが<= N; 場合([i]は.vx =!0 || [I] .vy!= 0 )計算値(I)
            そう であれば(POW([I] .X、2)POW([I] .Y、+ 2)<= POW(R、2))E ++ 
    ソート(P + 1、P + CNT + 1 )。
    以下のためにint型 i = 1 ; iが<=(CNT >> 1); iは++ ){
         int型 L = LOWER_BOUND(P + 1、P + CNT + 1、Q [i]が[ 0 ]) - P、R = LOWER_BOUND(P + 1、P + CNT +1、Q [i]を[ 1 ]) - P。
        (RT、追加1 、CNT、L、R)を、
    } 
    ANS = sの[RT] + E。
    printf(" %dの" 、ANS)。
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/mastervan/p/11123382.html