タイトル説明
サンプル入力と出力
入力#1
8 3 6 5 4 2 7 1 8
出力#1
BAAAABAB
入力#2
15 3 11 2 5 10 9 7 13 15 8 4 12 6 1 14
出力#2
ABAAAABBBAABAAB
データ範囲
1 <= N <= 1e5,1 <= <愛= N
問題解決のためのアイデア
暴力:少し、形而上学の複雑さ
正解:
大物は逆トポロジカルソート図+によって構築されています
こんにゃくFucaiだけDFS
ACコード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 CONSTの INT N = 1E6 + 10 。 LL B [N]、VIS [N]、DEP [N]、NUM [N]、[N]、T、N、M、K、X、Y。 INT DP [N] [ 3 ]。 チャー V [ 1005 ] [ 1005 ]。 INT DFS(int型のx、int型NUM){ 場合(DP [X] [NUM%2 ] =! - 1)戻り DP [X] [NUM%で2 ]。 他{ DP [X] [NUM%2 ] =(NUMの%2 == 0)?0:1 。 int型は、 DID = 0を。 以下のために(int型 I = 1 ;; I ++ ){ int型 L = XI * [X]、R = X + i *が[X]。 場合(L> = 1 && [L]> [X]){ 場合(NUMの%2 == 0)DP [X] [NUM%で2 ] = MAX(DP [X] [NUM%2 ]、DFS( L、NUM + 1))、DID = 1 。 他 DP [X] [NUM%で2=分(DP [X] [NUM%2 ]、DFS(L、NUM + 1))、DID = 1 。 } 場合(R <= N && [R]> [X]){ 場合(NUM%2 == 0)DP [X] [NUM%で2 ] = MAX(DP [X] [NUM%で2 ]、DFS( R、NUM + 1))、DID = 1 。 他 DP [X] [NUM%で2 ] =分(DP [X] [NUM%2 ]、DFS(R、NUM + 1))、DID = 1 。 } 場合(L < 1つの && R> N)、ブレーク。 } もし(!){た 戻り DPを[X] [NUM%2 ] = NUM%2 。 } } 戻り DP [X] [NUM%で2 ]。 } int型のmain(){ CIN >> N。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ CIN >> [I]。 DP [I] [ 0 ] = DP [I] [ 1 ] = - 1 。 } のための(int型 i = 1 ; iが<= N; iが++ ){ 場合(DFS(I、0))COUT << " A " 。 他の裁判所未満<< 「B 」。 } } / * 15 3 11 2 5 10 9 7 13 15 8 4 12 6 1 14 * /