この質問は数日前を過ぎて水で、今、水のうちほとんどの印象ではありません。
まず、私たちは、それは、非常に良い最長の連続した長さの範囲で解決を見てみましょう。
それから私は、山と海を考えるが、私はまだ行っていません。
それから彼はまた、試験T3ホテルホテル(私はQAQの上に直接暴力を使用)、正のソリューション・セグメントの木の前に長い時間のためにと思いました。
しかし、私はチームが唯一のMo Moのチームを使用する学校で、現在だと思うという理由だけで、木のラインを考えることはできません。
その後、まだ彼は学生に尋ねました。
そして、非常にシンプル。
当社は、これらの操作の範囲を求めて検討してください。
一つのアプローチは、木の妖精ツリーのカバー範囲の問題の様々な解決することです。
別のアプローチは、ポイントのMoチームをカンニングすることです。
チームはいけません。。左移動します(エスケープ
この場所の木の行番号の範囲内で「1」へのすべての位置、Moの動作チームを「1」に減少を削除し、直接されて答える[1、n]はの:だからこの質問アイデアが出てくることができます最も長い連続期間の長さ。
あなたはタイトルの類似したツリーラインを行っている場合は、この種のものは、飼料に非常に簡単です。
1の#include <cstdioを> 2の#include <CStringの> 3の#include <iostreamの> 4の#include <アルゴリズム> 5の#include <cmath> 6 使って 名前空間STD。 7 のconst int型 N = 5E4 + 5 。 8インラインint型リード(){ 9 INT X = 0、F = 1。チャー CH = GETCHAR()。 10 一方(CH < ' 0 ' || CH> ' 9 ')は、f =(CH == ' - '?) - 1:1、CH = GETCHAR()。 11 一方(CH> = ' 0 ' && CH <= ' 9 ')、X = X * 10 + CH- ' 0 '、CH = )(GETCHAR。 12 リターンのX *はF; 13 } 14 15 int型N、M、BLO。 16 int型COL [N]、ベル[N]、ANS [N]。 17 構造体ノード{ 18 のint L、R、ORD。 19 インラインフレンドブール 演算子 < (ノードA、ノードB){ 20 リターン(ベル[ら] ^ベル[BL])?ベル[ら] <ベル[BL]:((ベル[ら]&1)AR <BR:AR> BR)。 21 } 22 } Q [N]。 23 構造体Seg_Tree { 24 の#defineのLCH K << 1つの 25 の#define RCHのK << 1 | 1つの 26 構造体ノード{ 27 のint LMAX、RMAX、Mmaxを。 28 int型のlen; 29 } TR [N << 2 ]。 30 インラインボイドビルド(int型 K、int型の L、int型R){ 31 TR [K] .LEN = R-L + 1 。 32 であれば(L == R)のリターン; 33 INT半ば=(L + R)>> 1 。 34 ビルド(LCH、L、MID);ビルド(RCH、ミッド+ 1 、R)。 35 } 36 インラインボイドアップ(int型K){ 37 TR [K] .lmax = TR [LCH] .lmax。 38の TR [K] .rmax = TR [RCH] .rmax。 39 であれば(TR [LCH] .lmax == TR [LCH] .LEN)TR [K] .lmax + = TR [RCH] .lmax。 40 であれば(TR [RCH] .rmax == TR [RCH] .LEN)TR [K] .rmax + = TR [LCH] .rmax。 41 TR [K] .mmax = MAX(MAX(TR [LCH] .mmax、TR [RCH] .mmax)、TR [LCH] .rmax + T R [RCH] .lmax)。 42 } 43 インラインボイド挿入(int型 K、int型の L、INT R、INT X){ 44 であれば(L == X && R == X){ 45 TR [K] .lmax = 1 ; T R [K] .rmax = 1 ; TR [K] .mmax = 1 。 46 リターン; 47 } 48 INT半ば=(L + R)>> 1 。 49 であれば(X <= MID)挿入(LCH、L、中、X)。 50 他の挿入(RCH、ミッド+ 1 、R、X)。 51 アップ(K)。 52 } 53 インラインボイド消去(int型 K、int型の L、INT R、INT X){ 54 であれば(L == X && R == X){ 55 TR [K] .lmax = 0 ; TR [K] .rmax = 0 ; TR [K] .mmax = 0 。 56 リターン; 57 } 58 INT半ば=(L + R)>> 1 。 59 もし = <(XMID)消去(LCH、L、中、X)。 60 他の消去(RCH、ミッド+ 1 、R、X)。 61 アップ(K)。 62 } 63 } STR。 64 65 、INT (){主 66 N = (読み取り) 67 、M = )(読み取ります。 68 BLO =(INT)SQRT(N)+ 1 。 69 str.Build(1、1 、N) 70 のために(int型 I = 1 ; I <= BLO ++ i)が 71 のために(INT J = 1; J <= BLO; ++ j)の 72 {ベル[(I- 1)* BLO + J] = I。もし((I- 1)* BLO + jは== N)ブレーク;} 73 のために(int型 I = 1 ; I <= N; ++ I)COL [I] = 読み取ります(); 74 のために(int型 I = 1 ; I <= M; ++ i)が{ 75 、Q [i]が.L = (読み取り) 76 Q [i]を.R = 読み取ります(); 77 Q [i]は.ord = iは、 78 } 79 ソート(Q + 1、Q + M + 1 )。 80 登録のint L = Q [ 1 ] .L、R = Q [ 1 ] .Rします。 81 のためには、(int型、I = 1と、I <= R; ++ I)str.Insert(1、1 、nは、COL [I])。 82 のためには、(int型 I = 1 ; I <= M; ++ I){ 83 ながら(R <Q [i]は.R)str.Insert(1、1、nは、COL [++ R])。 84 一方(L> Q [i]は.L)str.Insert(1、1、nは、COLの[ - L])。 85 一方(L <Q [i]が.L)str.Erase(1、1、nは、COL [L ++]); 86 一方、(R> Q [i]は.R)str.Erase(1、1、nは、COL [r--の])。 87の ANS [Q [i]は.ord] = str.tr [ 1 ] .mmax。 88 } 89 のための(int型 I = 1 ; I <= M; ++ I)のprintf(" %Dを\ n " 、ANS [I])。 90 リターン 0 ; 91 }