羅区P2161セグメントツリー染色SHOI2009会場予約

トピックへのリンク:https://www.luogu.org/problem/P2161

問題の意味:二つの操作があり、操作Aを間隔Lで染色され、R、ケース及び空気のものと出力色の重なりの数ながら、Bは、多くの色が残っている統計演算部です。

分析:だけ間隔を変更するために使用されるツリーライン、を行うには色が削除されていない場合、唯一の色の範囲を見つけるたびに、それがカウントされ、除去、改変されます。配列は、直接デルを達成するために使用することができます削除します。

#include <ビット/ STDC ++ H.>
 使用して 名前空間STD; 
typedefの長い ロング; LL
 のconst  int型 INF = 0x3f3f3f3f ;
 CONST  INT MOD = + 1E9 7。;
 のconst  int型 MAXN = + 2E5 7。;
 の#define。LS << RT 1つ
 の#define RS RT < 。<1 | 1
 INT CNTは= 0 ; // 色の現在の数
int型 ANS = 0 ; // この時間が記録されているどのように多くの色が
int型 RES; //は、多くの色がどのように一のユーザの削除録音
ストラクトノード{
     チャーをオプト[ 2 ];
     int型のL、R&LT; 
} A [MAXN]; 
BOOL同じ[MAXN << 2 ]; // 同じ色の範囲内で、色が同じであるか否かを示す
int型のタグは[MAXN << 2 ]; // 遅延タグカラー記録
BOOL ;デル[MAXN] // カラーマーカーが削除されているかどうかのための
空隙を作る(INT RT、int型の L、INT R&LT){ 
    同[RT] = 1 ;タグ[RT] = 0 ;
     のiF(R&LT == L)のリターン;
     int型 MID =(L + R&LT)を>> 1 ; 
    (LS、L、MID)を構築し、 
    MID、(RSビルド +。1 、R&LT); 
} 
ボイドプッシュダウン(int型 L、int型の R&LT、INT RT){ 
    同[RT] = 0 ; // キー!//はそれが表示さの下で、特定の色が同じではありません渡すことができます
    IF(!タグ[RT])リターン;
     // タグ分権 
    タグ[LS]タグ= [RS] = タグ[RT]; 
    タグ[RT] = 0 ; 
} 
無効検索(int型の L、INT R&LT、INT RT){
     IF(同じ[RT] == 1 ){
         IF(!デル[タグ[RT]] &&タグ[RT])ANS - 、++ resは; 
        デル[タグ[RT] = 1 
        タグ[RT] = CNT。// 记录は颜色
        返します
    } 
    INT半ば=(L + R)>> 1 
    (L、中、LS)を見つける;見つける(MID + 1をR、RS)。
    同じ[RT] = 1 ;タグ[RT] = CNT。
} 
ボイドは、(変更のint L、INT R、int型の、INT T、INT {RT)
     場合(S <= 1 && Rは<= T){ 
        見つける(L、R、RT)。
        返します; 
    }
    プッシュダウン(L、R、RT)。
    INT半ば=(L + R)>> 1 もし(S <= MID)(L、中、S、T、LS)を修正します。
    場合(T> MID)は(MID +修正1 、R、S、T、RS)。
} 
int型のmain(){
     int型のn; scanf関数(" %のD "、&N)
    int型 ST = infを、ED = 0 ; // 记录左右端点
    のためのint型 i = 1 ; iは<N =、iは++ ){ 
        scanf関数(" %sの" 、[I] .OPT)。
        もし([I] .OPT [ 0 ] == "A ' ){ 
            scanf関数(" %D%dの"、および[I] .L、&[I] .R)。
            ST =分(ST、[I] .L); ED = MAX(編、[I] .R)。
        } 
    } 
    構築(1 、ST、ED)。
    int型 i = 1 ; iが<= N iが++ ){
         場合([i]が.OPT [ 0 ] == ' A ' ){
             ++ ANS; ++ CNT; RES = 0 
            変更(ST編、[I] .L、[I] .R、1 )。
            printf(" %d個の\ n "、RES)。
        } 
        のprintf(" %d個の\ n " 、ANS)。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/qingjiuling/p/11455804.html