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)。 }