非退屈seqences

#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.パーティション、従って各出現で再チェックを防止する、それぞれ左右を確認しながらは、最後のパーティションであります

ヒューリスティック分割統治、バイナリ分割統治

おすすめ

転載: www.cnblogs.com/rign/p/11297973.html
おすすめ