Codeforces 1146Eホットコールドセグメントツリーです

ホットコールドです

私はトラブルに記述する場合、実際には、各セグメントツリーの反転分布のための唯一のメンテナンス間隔、間隔の割り当てをすることができます。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、

CONSTの INT N =(INT)1E5 + 7 

INTのN、Q、POS、[N]。
チャーOP [N]。

構造体のビット{
     INT [N]。
    ボイド変更(int型のx、int型V){
         ためint型 I = xを、iがNを<; I + = I& - I){ 
            [I] + = V。
        } 
    } 
    int型の照会(INT X){
         int型 ANS = 0 以下のためにint型 I = xを、I; I - = I& - i)を{ 
            ANS + = [I]。
        } 
        戻りANS。
    } 
}ビット。

#define LSONリットル、ミッド、室温<< 1つ
 の#define半ば+ 1、R、RT << 1 rson | 1
 構造体SegmentTree {
     int型 [N << 2 ]、怠惰[<< Nを2、フリップ] [N << 2 ]。
    インラインボイドプッシュ(INT RT){
         場合(怠惰[RT]){ 
            [RT << 1 ] = 怠惰[RT]。
            アート<< 1 | 1 ] = 怠惰[RT]。
            怠惰[RT << 1 ] = 怠惰[RT]。
            フリップフロッ[RT << 1 ] = 0 ; 
            怠惰な[RT << 1 | 1 ] = 怠惰[RT]。
            [RT反転 << 1 | 1 ] = 0 ; 
            怠惰[RT] = 0 ; 
        } 
        もし{([RT]フリップ)
            [RT << 1 ] = -a [RT << 1 ]。
            [RT ;<< 1 | 1 ] = -a [RT << 1 | 1 ]。
            もし(レイジー[RT << 1 ])レイジー[RT << 1 ] = -lazy [RT << 1 ]。
            他のフリップ[RT << 1 ] ^ = 1 ;
            もし(怠惰[RT << 1 | 1 ])怠惰な[RT << 1 | 1 ] = -lazy [RT << 1 | 1 ]。
            他のフリップ[RT << 1 | 1 ] ^ = 1個の
            フリップフロッ[RT]= 0 ; 
        } 
    } 
    ボイド更新(int型 L、INT R、int型のVal、INT L、INT R、INT RT){
         場合(R <L || R <L || R <L)のリターン;
        もし(L <= 1 && R <= R){ 
            [RT] = ヴァル。
            怠惰[RT] = ヴァル。
            [RT]フリップ = 0 返します
        } 
        プッシュ(RT)。
        int型ミッド= L + R >> 1 
        アップデート(L、R、ヴァル、LSON)。
        アップデート(L、R、ヴァル、rson)。
    } 
    ボイドアップデート2(int型 L、INT R、int型の L、INT R、INT RT){
         場合(R <L || R <L || R <L)のリターン;
        もし(L <= 1 && R <= R){ 
            [RT] = - [RT]。
            もし(怠惰[RT])怠惰[RT] = - 怠惰[RT]。
            他のフリップ[RT] ^ = 1 ;
            返します
        }
        プッシュ(RT)。
        int型ミッド= L + R >>1を
        アップデート2(L、R、LSON)。
        アップデート2(L、R、rson)。
    } 
    INTクエリ(INT P、int型の L、int型の R、int型RT){
         場合(Lは== R)を返す[RT]。
        プッシュ(RT)。
        INT半ば= L + R >> 1 もし(P <= MID)リターンクエリ(P、LSON)。
        他の リターンクエリ(P、rson)。
    } 
}木。

のショー(){
     のためにint型のI =1 ; iが<= N; I ++){
         int型 ANS = 0 もし([I]!= 0 ){
             場合(ABS([I])> POS)ANS = ABS([I])* Tree.query(ABS([I])、01000001 );
            他の ANS =(bit.query(ABS([i])と)&1)?- [I]:[i]は、
        } 
        のprintf(" %d個の%のC "、ANS、" \ n " [I == N])。
    } 
} 

int型のmain(){ 
    scanf関数(" %D%dの"、&​​N、&Q);
    以下のためにint型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。
    POS = 100000 ;
    一方、(q-- ){
         int型、X 
        scanf関数(" %sの%のD "、OP、およびX)
        もし(* OP == ' > ' ){
             場合(X> = 0 ){ 
                POS = 分(POS、X)。
                Tree.update(X + 1100000、 - 101000001 )。
            } 
            { 
                POS =分(POS、-X - 1 )。
                Tree.update( -x、100000、 - 101000001 )。
                Tree.update2(1、-x - 101000001 )。
                bit.modify(11 )。
                bit.modify( -x、 -1 ); 
            } 
        } 
        {
             場合(X <= 0 ){ 
                POS =分(POS、 - X)。
                Tree.update( -x + 1100000101000001 )。
            } 
            { 
                POS =分(POS、X - 1 )。
                Tree.update(X、100000101000001)。
                Tree.update2(1、X - 101000001 )。
                bit.modify(11 )。
                bit.modify(X、 - 1 )。
            } 
        } 
    } 
    )(示す図です。
    リターン 0 ; 
} 

/ * 
* /

 

おすすめ

転載: www.cnblogs.com/CJLHY/p/11791682.html