SparseTableのTarjan、最も値の間隔RMQ問題を求めているため、すなわちSTテーブル。
私は複雑STテーブルは疑問である時間を持っている、と私はその問い合わせがO(1)の速度に達することができないと思います。多分ちょうど定数?しかし、ブルーブックに書かれた長さのn LOGN調整するために必要な時間のクエリ間隔の長さは、ケースですが、私はよく分かりません。
本質的に、それが関連していない複数のカバレッジの所定の間隔内で最も値を求める間隔の特性により、我々は、開始点から延びるストレージアレイを設定するようにカバーがより所定の動作範囲よりも、正当でないI (\ 2 ^ J \)間隔の長さの最小値。
各間隔のために、存在しなければならない(2 ^ kが\)\間隔の半分の長さよりも大きい、と我々は、2つの異なる出発点かかる長さとデータの広い範囲をカバーすることができ、そのKを見つけるように。
STテーブルの確立については、再帰的な方法が最も簡単です。各開始点について、まず、ゼロ時点の値にjの値、その後jは大きいため、ゼロよりも、第一と列挙jを昇順で:
\ [\ {テキストST [I] [J] = MAX(ST [I] [J -1]、ST [I + 1 << J-1] [J-1])} \]
国境への再帰的注意を払うには、クロスボーダーを避けるために。
理事会は、ここに掲載しました。
void prepare(){
for(int i=1;i<=n;i++)
st[i][0]=a[i];
for(int j=1;1<<j<=n;j++)
for(int i=1;i-1+(1<<j)<=n;i++)
st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]);
}
int result(int l,int r){
int k=0;
while(1<<k+1<=r-l+1)
k++;
return max(st[l][k],st[r-(1<<k)+1][k]);
}
理論的には問題ないが、もしあれば、修正されます。