lojの#6034「ヤリトレーニング2017 2日目」ラインゲーム

分析

リ・チャオ木ボードセクションのタイトル

コード

#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 ;
}

 

おすすめ

転載: www.cnblogs.com/yzxverygood/p/11764839.html