トピックへのリンク: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 。 }