羅区P2471 - [SCOI2007]降雨

機械ACはREを提出し......

ポータル:QAQQAQ

 

質問の意味:彼らは見て

 

アイデアは:この質問はRMQで迅速に行うことを言われますが、この質問は、セグメントツリーです

ギャップと最大範囲があるかどうかをセグメント一番左、一番右の年のツリーメンテナンス期間の間隔、

この質問は、次のような状況に分け、主要な難易度の分類を検討しています。

1.AB多分、出力を決定していません

2.Aは、Bの不確実性を決定します。

  AはB、おそらく最大出力にAであれば

  それ以外の場合はfalseを出力

3.A不確かBが決定されます。

  Bは、最大(A)BをLOWER_BOUNDされている場合、出力多分

  それ以外の場合はfalseを出力

4.A OK B OK

  Bは最大+ 1件のBである場合、Aの最大値は、真の出力との間のギャップなしで、Bであります

  上記の条件が満たされている、多分ギャップ、出力がある場合

  それ以外の場合はfalseを出力

 

コードの実装では、私が最初で最大値がライン上にBに等しいですが、何の判断が存在しないことを条件「よりも厳密に小さい」の前に等しいかどうかを考慮していませんでした

その後、停止しないクロスボーダーセグメントツリー独自の形而上学を防ぐために、いくつかの特別な裁判官を追加しました。(最近、コードの実装能力が...ああ改善されるべきです)

 

コード:

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 N = 100005 ; 
  
int型のn;
構造体ノード
{ 
    int型LY、RY、max_r、ギャップ。
}ツリー[N * 4 ]。
int型雨[N]、年[N]; 
  
ボイド push_up(ノード&FA、ノードLS、ノードRS)
{ 
    fa.ly = ls.ly。
    fa.ry = rs.ry。
    fa.max_r = MAX(ls.max_r、rs.max_r)。
    fa.Gap = 0 ;
    もし(ls.Gap || rs.Gap)fa.Gap = 1 もし(ls.ry + 1 <rs.ly)fa.Gap = 1 
} 
  
ボイドビルド(int型のx、int型 L、INT R)
{ 
    場合(L == R)
    { 
        ツリー[X] .ly = 年間[L]。
        ツリー[X] .ry = 年間[L]。
        ツリー[X] .max_r = 雨[L]。
        [X] .Gapツリー = 0 返します
    } 
    INT半ば=(L + R)>> 1 
    (Xビルド + X、L、中間の); 
    構築(X + X + 1、ミッド+ 1 、R)。
    push_up(ツリー[x]は、木[X + X]、ツリー[X + X + 1 ])。
} 
  
ノードクエリー(int型のx、int型の L、int型の R、int型の L、INT R)
{ 
    ノードRET。
    もし(L <= 1 && R> = R)戻りツリー[X]。
    INT半ば=(L + R)>> 1 もし(MID <L)戻りクエリ(X + X + 1、中間+ 1 、R、L、R)。
    もし(MID> = R)戻りクエリ(X + X、L、中、L、R)。
    ノードLS =クエリ(X +X、L、中、L、R)。
    ノードRS =クエリ(X + X + 1、中間+ 1 、R、L、R)。
    push_up(RET、LS、RS)。
    リターンRET; 
} 
  
int型のmain()
{ 
    scanf関数(" %のD "、&N)
    以下のためにint型 i = 1 ; iが<= N; iが++)のscanf(" %D%D "、&年[i]は、&雨[I])。
    ビルド(11 、N)
    int型 Q; scanf関数(" %のD "、&Q)。
    一方、(q-- 
    {
        INT X、Y、XX、YY、BL = 0 
        scanf関数(" %dの%のD "、&​​XX&YY)。
        もし(YY < XX)
        { 
            プット(" " )。
            続け; 
        } 
        であれば(XX == YY)
        { 
            プット(" 多分" )。
            続け; 
        } 
        、X = LOWER_BOUND(年+ 1、年間+ N + 1、XX) - 年。
        Y = LOWER_BOUND(年+1、年+ N + 1、YY) - 年。
        もし(!XX =年間[X] && YY =年[Y])プット(" たぶん" );
        それ以外の 場合(!XX = 年間[X])
        { 
            場合(Yの== 1 ||のx == y)のプット(" たぶん" );
            
            { 
                ノードn1 =クエリ(11 、nは、X、Y)
                ノードn2 =クエリ(11、nは、X、Y- 1 )。
                // 中间降雨量必须严格小于!
                もし(n1.max_r ==雨[Y] && n2.max_r <雨[Y])プット(" 多分" )。
                他のプット(); 
            } 
        } 
        そう であれば(YY =!年[Y])
        { 
            場合(Xの== N || X == Y- 1)プット(" 多分" )。
            
            { 
                ノードn1 =クエリ(11、nは、X、Y- 1 )。
                ノードn2 =クエリ(11、N、X + 1、Y- 1 );
                もし(n1.max_r ==雨[X] && n2.max_r <雨[X])プット(" 多分" )。
                他のプット(); 
            } 
        } 
        
        { 
            もし、(X + 1つの ==のY)
            { 
                場合(雨[X] <雨[Y])プット(" " )。
                それ以外の 場合(年間[X] + 1 ==年[Y])プット(" " );
                他のプット("多分" );
                 続ける ; // ...ああ続ける前に書き込まれていない 
            } // 公報決意は、セグメントツリーが境界防止 
            ノードN1 =クエリ(。11 、N-、X、Y)、
            ノードN2 =クエリ(1。1、N - 、Xが+ 1 、Y)、
            ノードN3 =クエリ(11、N - 、Xが+ 1、Y- 1 )、
             IF(n2.max_r ==レイン[Y] &&雨[Y] <=雨[X] n3.max_r && < 雨[Y])
            { 
                IF)n1.Gap(プット(" 多分");
                他のプット(); 
            } 
            他のプット(" " ); 
        } 
    } 
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/Forever-666/p/11210715.html