CF52C円形RMQ

トピックリンク

アイデア:

この質問が、それについて少し変化するように、それは、一般的な間隔は、変更とクエリの問題はまだですが、リングにシーケンス。

あなたは、L <Rを入力した場合、変更とクエリが一般的である、およそカテゴリー話。それは環状であるため、しかし、それは実際には、これは2つの1のR LN及び操作缶に分割され、L> Rであろう。

コード、ノーコード、あまりにも多くの水

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 MAXN = 1E6 + 7 構造体ノード{
     int型のL、R。
    長い 長いマイル、怠惰な。
}ツリー[MAXN * 4 ]。
INTのN、M。
ブールスペース。
INT [MAXN]。
int型のL、R。
長い 長いV; 
インライン長い read_long()
{ 
    スペース = 0 
    登録長い  S = 0、W =1 ; 
    登録チャー C = GETCHAR()。
    一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ') - W = 1、C = GETCHAR();}
     一方(> = C ' 0 ' && cが<= ' 9 ')S =(S << 1)+(S << 3)+ C- 48、C = GETCHAR()。
    もし(C == '  ')スペース= 1 ワット; 
} 
インラインINT read_int()
{ 
    スペース = 0 
    登録INT S = 0、W = 1 
    登録チャー C = GETCHAR()。
    一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ') - W = 1、C = GETCHAR();}
     一方(> = C ' 0 ' && cが<= ' 9 ')S =(S << 1)+(S << 3)+ C- 48、C = GETCHAR()。
    もし(C == '  ')スペース= 1 リターンの* ワット。
} 
ボイドビルド(int型、今int型、LをINT {R)
    ツリー[今] .L = L、木[今] .R = R。
    もし(L == R){ 
        ツリー[今]の.mi = [L]。
        返します
    } 
    INT半ば=(L + R)>> 1 
    (今の構築 << 1 、L、ミッド)。
    今(ビルド<< 1 | 1、中間+ 1 、R)。
    ツリー[今]の.mi =分(ツリー[今<< 1 ]の.mi、ツリー[今<< 1 | 1 ]の.mi)。
} 
ボイドプッシュダウン(int型今){
     場合(ツリー[今] .lazy){ 
        ツリー[今 << 1 ]の.mi + = ツリー[今] .lazy。
        ツリー[今すぐ << 1 | 1 ]の.mi + = ツリー[今] .lazy。
        ツリー[今 << 1 ] .lazy + = ツリー[今] .lazy。
        ツリー[今すぐ << 1 | 1] .lazy + = ツリー[今] .lazy。
        ツリー[今] .lazy = 0 
    } 
} 
ボイド更新(int型、今のint L、int型の R、長い 長い{v)の
     場合(ツリー[今] .L> = L &&ツリー[今] .R <= R){ 
        ツリー[今]の.mi + = V。
        ツリー[今] .lazy + = V;
        返します
    } 
    プッシュダウン(今)。
    INT半ば=(ツリー[今] .L +ツリー[今] .R)>> 1 もし(L <= MID)更新(今<< 1 、L、R、V)。
    もし(R> MID)更新(今<< 1 | 1 、L、R、V)。
    ツリー[今]の.mi =分(ツリー[今<< 1 ]の.mi、ツリー[今<< 1 | 1 ]の.mi)。
} 
長い 長いクエリ(int型今、INT L、INT R){
     場合(ツリー[今] .L> = L &&ツリー[今] .R <= r)は戻りツリー[今]の.mi。
    プッシュダウン(今)。
    INT半ば=(ツリー[今] .L +ツリー[今] .R)>> 1 長い 長い ANS = 1E20;
    もし(L <= MID)ANS =分(ANS、クエリ(今<< 1 、L、R))。
    もし(R> MID)ANS =分(ANS、クエリ(今<< 1 | 1 、L、R))。
    戻るANSを。
} 
int型のmain(){ 
    scanf関数(" %のD "、&N)
    以下のためにint型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。
    ビルド(11 、N)
    scanf関数(" %のD "、&M)。
    以下のためにint型 iは= 1 ; iが<= M iは++ ){ 
        L = read_int(); R =  read_int()。
        L ++、R ++ もし(空間){ 
            V = read_long()。
            場合(L> R){ 
                更新(1 、L、N、V)。
                アップデート(11 、R、V)。
            } 
            そうでなければ更新(1 、L、R、V)。
        } 
        {
             場合(L> R)のprintf(" %LLDする\ n "、分(クエリ(1、L、N)、クエリ(11 、R)))。
            のprintf(" %LLDの\ nを、クエリ(1 、L、R))。
        } 
    } 
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/LJB666/p/11628211.html