次の日、私たちはKeduo李水の問題で引退したツリーに準拠する必要があります。
コードは次のように実装されています。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineする ITが設定<ノード> ::イテレータ の#define担当者(iは、、B)は(レジスタINT I =(A); iが<=(B); iは++)のconst int型 MAXN = 5E5 + 5 。INTの N、M、CNT = 1 。 チャーSTR [MAXN]。構造体ノード{ int型のL、R。 変更可能なchar型のV; ノード(INT L、int型の R = - 1、チャー V = 0 ):L(L)、R(R)、V(V){} int型の演算子(< CONSTノード&O)のconst { 戻り L < OL。 } }。 セット <ノード> S。 intです読み出す(){ int型のx = 0、フラグ= 0 。 CHAR CH = ' ' ; しばらく(CH =!' - ' &&(CH < ' 0 ' || CH> ' 9 '))CH = getchar関数(); もし(CH == ' - ' ){ フラグ =1 ; CH = GETCHAR()。 } 一方、(CH> = ' 0 ' && CH <= ' 9 ' ){ X =(X << 1)+(X << 3)+(CH ^ ' 0 ' )。 CH = GETCHAR()。 } を返すフラグ?- X:X; } ITは、(分割のint {POS)を ITが = s.lower_bound(ノード(POS))を、 もし(それ= s.end()&& IT-> L == POS!)を返すことを。 それは - 。 INT L = IT-> L、R = IT-> R。 チャー V = IT-> V。 s.erase(それ)。 s.insert(ノード(L、POS - 1 、V))。 戻りs.insert(ノード(POS、R、V))を最初。 } ボイド割り当て(int型 L、int型の R、チャーヴァル){ IT ITR =スプリット(R + 1)、ITL = スプリット(L)。 s.erase(ITL、ITR)。 s.insert(ノード(L、R、ヴァル))。 } チャー get_val(int型POS){ それIT =スプリット(POS)を、 戻る > IT-をV; } int型のチェック(int型 L、INT R){ IT ITR =スプリット(R + 1)、ITL = スプリット(L)。 CHAR今= itl-> V。 しばらく(!ITL = ITR){ 場合(!今= itl-> v)のリターン 0 ; ITL ++ ; } リターン 1 。 } int型のmain(){ N = )(読み取ります。 scanf関数(" %sの"、STR +1 ); チャープリ=列str [ 1 ]。 担当者(I、2 、N){ 場合(プレ==列str [i])とCNT ++ 。 他{ s.insert(ノード(I - CNT、I - 1 、PRE))。 CNT = 1 。 プリ =のSTR [I]。 } } s.insert(ノード(N - CNT + 1 、N、PRE))。 M = 読み取ります(); チャー TMP [ 3 ]。 担当者(I、1 、M){ int型のL、R。 scanf関数(" %sの"、TMP + 1)、L = read()は、R = リード()。 もし(TMP [ 1 ] == ' A ' ){ チャー OPT [ 3 ]。 scanf関数(" %sの"、OPT + 1 )。 割り当てる(Lは、rは、オプト[ 1 ])。 } 他{ 場合(1- == 1 ||リットル== N || R == 1 || R == N){ 場合のprintf(((L、R)を確認) "N \はい" ); 他ののprintf(" なしの\ n " ); 続ける; } チャー A = get_val(1 - 1)、B = get_val(R + 1 ); 場合(==のB ||チェック(L! 、R))のprintf(" なしの\ n " ); 他のprintf(" はいの\ n " ); } } 戻り 0 ; }
ODTは、O2のみ90pts(私はあまりにもこんにゃくだったことももちろん可能)ので、開いていない、問題は正の解を解決していません。
ツリーラインのアプローチはそれを書くための時間を持っています。