分析
リ・チャオ木ボードセクションのタイトル
コード
#include <ビット/ STDC ++ H>
使用して 名前空間STDを、
#defineデシベルダブル
のconst int型 INF = 1E8;
const int型 N = 1E5;
整数 N、M、です。
構造体ノード{
int型のX1、X2。
デシベルのY1、Y2;
ノード(INT X1 = -N、INT X2 = N、DB Y1 = -1e8、DB Y2 = - 1E8):X1(X1)、X2(X2)、Y1(Y1)、Y2(Y2){}
}。
ノードD [ 800100 ]。
インラインDB計算値(ノードx、int型PL){
場合(x.x2 == x.x1)戻りMAX(x.y1、x.y2)。
戻り x.y1 +(DB)(x.y2-x.y1)/(x.x2-x.x1)*(PL- x.x1)。
}
インラインボイド更新(INTル、INT RI、INT WH、ノードX){
場合(x.x1> RI || x.x2 <LE)のリターン;
int型半ば=(LE + RI)>> 1 。
もし(x.x1 <=ル&& x.x2> = RI){
DBさt1 = CALC(D [WH]、MID)、T2 = CALC(X、MID)。
もし(T1 < T2){
場合(計算値(D [WH]、LE)>計算値(X、LE))更新(LE、中間、WH << 1 、D [WH])。
もし(計算値(D [WH]、RI)>計算値(X、RI))更新(MID + 1、RI、WH << 1 | 1 、D [WH])。
D [WH] =のX。
} 他{
場合(計算値(X、LE)>計算値(D [WH]、LE))更新(LE、中間、WH << 1 、X)。
もし(計算値(X、RI)>計算値(D [WH]、RI))更新(MID + 1、RI、WH << 1 | 1 、X)。
}
返します。
}
もし(MID> = x.x1)更新(LE、中間、WH << 1 、X)。
もし(ミッド<x.x2)更新(ミッド+ 1、里、WH << 1 | 1 、x)は、
返します。
}
インラインdBのQ(INTル、INT RI、INT WH、INT PL){
場合(LE == RI)リターン計算値(D [WH]、PL)。
int型半ば=(LE + RI)>> 1 。
DB ANS = CALC(D [WH]、PL)。
もし(中期> = PL)ANS = MAX(ANS、Q(ル、ミッド、WH << 1 、PL));
他の ANS = MAX(ANS、Q(ミッド+ 1、里、WH << 1 | 1 、PL));
戻るANSを。
}
INT のmain(){
int型I、J、K。
scanf関数(" %d個の%のD "、&N、&M)。
用(i = 1 ; iが<= N; iは++ ){
int型のX1、X2、Y1、Y2、
CIN >> X1 >> Y1 >> X2 >> Y2;
もし(X1> X2)スワップ(X1、X2)、スワップ(Y1、Y2);
アップデート(1、N、1 、ノード(X1、X2、Y1、Y2))。
}
用(i = 1 ; iが<= M; iは++ ){
scanf関数(" %のD "、&K)。
もし(!K){
int型X1、X2、Y1、Y2;
CIN >> X1 >> Y1 >> X2 >> Y2;
もし(X1> X2)スワップ(X1、X2)、スワップ(Y1、Y2);
アップデート(1、N、1 、ノード(X1、X2、Y1、Y2))。
} 他{
int型のX; scanf関数(" %のD "、&x)は、
DB RES = Q(1、N、1 、X)。
printf(" %0.2lfする\ n "、RES <= - INF?0 :RES)。
}
}
リターン 0 ;
}