#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineのための前部(I、_a、_b)(I =(INT)(_ A)がINT; iが=(INTを<)(_ B); iが++) の#define forb(I、_a、_b)のための式(I(= int型INT)(_ A); I> =(INT)(_ B); i--) の#define FIR最初 の#define秒第二 の#define SZ(A)(INT)(A).size() の#define PB一back の#defineすべての(C)(C).begin()、(C).END() の#define ENDL '\ n'は typedefの長い 長いLL。 typedefの符号なしの長い 長いULL。 typedefのペア < int型、int型 > PII。 const int型 INF = 0x3f3f3f3f 。 マップ < int型、int型 > 融点; CONSTの INT N =(INT)2E5 + 5 。 INT プレ[N]、NEX [N]。 INT [N]。 BOOL is_unique(INT P、int型の L、INT R){ 場合(PRE [P] <L && NEX [P]> R)を返す 真。 返す 偽; } ブールチェック(int型 L、int型R){ 場合(L> = R)返す 真; INT半ば=(R-L + 1)>> 1 。 前部(I、1、中間+ 1 ){ int型のLPOS = 1 + I- 1 。 もし(is_unique(LPOS、L、R)){ 戻りチェック(L、lpos- 1)・チェック(LPOS + 1 、R)。 } INT RPOS = R-I + 1 。 もし(is_unique(RPOS、L、R)){ 戻りチェック(L、rpos- 1)・チェック(RPOS + 1 、R)。 } } リターン 偽; } int型のmain(){ IOS :: sync_with_stdio(0 )。 cin.tie(0 )。 cout.tie(0 )。 int型 T; cinを>> T; 一方、(T-- ){ int型のn; CIN >> N。 前部(I、1、n)がCIN >> [I]。 mp.clear(); 前部(I、1 、N){ 場合(!mp.count([I]))プレ[I] = - 1 。 他のプリ[I] = MP [[I]]; MP [I] = I。 } mp.clear()。 forb(I、nは、1 ){ 場合(mp.count([I])!)NEX [I] = N + 1 。 他の NEX [I] = MP [[I]]; MP [I] = I。 } であれば(チェック(1、n))をCOUT << " 掘削非" << ENDL。 他の裁判所未満<< " 退屈" << てendl; } 戻り 0 。 }
各サブセクションは番号が一度だけ表示されている、使用分割統治するための全区間か否かを決定します
最適化注:左側と右側のそれぞれのデジタル記録位置が再度表示され、O(1)チェック
2.パーティション、従って各出現で再チェックを防止する、それぞれ左右を確認しながらは、最後のパーティションであります
ヒューリスティック分割統治、バイナリ分割統治