詳細STテーブル

ST表学習
効果:STアルゴリズムは、例えば、最小の用紙の所定の範囲RMQのために最大の価値を解決するために使用されています

例えば:

1の大部分の値は、配列A [〜5 0] = {5,4,6,10,1,12}、次いで区間[2,5]の間に与えられます。

方法:オフライン前処理(nlogn)とオンライン照会(O(1)):STアルゴリズムは、2つの部分に分割されます。あなたはまた、最も値の範囲を解決するなど、ツリーライン、ツリーのリストを、使用することができますが、STアルゴリズムは速くそれらよりもですが、また、オンラインでのお問い合わせのためのが。

(1)前処理オフライン:最も価値の間隔を解決するためのDPのアイデアの使用、および2次元配列に保存します。

(2)オンライン問い合わせ:所定の間隔ごとに分割され、最も値の2次元アレイによって

具体的な説明:

(1)前処理オフライン。

思想ST DPアルゴリズムは、一見間隔に属し、最も価値の間隔、動的計画法を解決するために、しかし、間隔が大きくなり、長さが増加していないたびにではなく、長さ2 ^私の増加を倍増する考え。

使用F [I、J]私は出発点として表さ、2 ^ J最も値区間の区間長、この時間間隔[I、I + 2 ^ J - 1]。

例えば、F [0,2]が4と等しい最小間隔[0,3]を表し、区間[2,5]を表すF [2,2]は最小値であり、すなわち、1に等しいです。

F [I、J]を解くときに、STは、2 ^ jの間隔の長さの最初のアルゴリズムである[I、I + 2 ^ J - 1]が2等分され、それぞれの長さが2 ^( - 1、J)であります。これら二つの部分のF値を解いた後、それぞれ[I、J - 1]およびF [I + 2 ^(j - 1)、J - 1]。最後に、これらの二つのセクションの中で最も値と組み合わせて、全範囲のために最大の価値を見つけます。特別な場合は、ときJ = 0、間隔の長さ、すなわち、唯一の素子間隔は、F [I、0]は各要素の値に等しくなければならない、1に等しいです。

例えば:最小要件ソリューションF [1,2]の値、すなわち、溶液間隔[1,4] = {} 4,6,10,1この時点で、このセクションを配置する必要があり、すなわち、等しい長さの2つのセクションに分割され[1,2]及び[3,4]は別々にこれらの二つのセクションの最小値を解決した後に、です。この時点で、これらの2つのセクションでは、最小値F [1,1]およびF [3,1]に対応します。

状態遷移方程式はFである[I、J] =分(F [I、J - 1]、F [I + 2 ^(j - 1)、J - 1])

初期状態:F [I、0] = A [i]に。

式再帰転送状態によれば、各要素は、最初に最も値の区分1の間隔長さ、間隔のその後の間隔の長さを見つけるし、次いで区間長に間隔4が最良の値を求めるその後、2の最良の値を求めます... 。、最後に、n個の要素の数を表す各LOG2の区間長後の溶液中の要素^ N最も値間隔、アルゴリズムの終了のため。

すなわち:シークするF [0] [1]、F [1] [1]、F [2] [1]、F [3] [1] ,,, F [N] [1]、その後シーク.F [0] [2]、F [1] [2]、F [2] [2]、F [3] [2] ,,, F [M] [2]、...

(2)オンライン処理:ここでは、最も値を解くこと、区間[X、Y]を照会することが知られています。

前処理中、間隔の長さに対応する各状態は、2 ^ Iです。間隔の長さは、クエリを与えられることにあるので、我々は、クエリ処理部を処理しなければならないので、必ずしも正確に2 ^私ではありません。

セル間の長さを必要とする前処理の結果を使用するために全体のゾーン(2)を覆うルーム(1)は、2つのセルの2つのセルは、2つの条件を満たしている間ここでは、2セルの間隔の間で分割されるクエリ彼らは等しく、2 ^ Iです。二つのセル間で重複してもよいことに留意されたいです。

例えば:[3,7]及び[8,11]に2つのアリコート間隔、最初のセットをしようとする区間[3,11]を、照会します。これら2つの間隔のさらなる拡張後2 ^ Iの許容長さに等しいです。それは2 ^ iは、になるまでの間隔の長さは、増加し続けた後わずか2は、それぞれ、区間長4及び5を分割しました。この時間間隔の最小の長さは、iが3 =とき、8つの出会う二つの条件です。

私は、直接プログラムはインターバルの長さを計算し、そう面倒ではない、我々はでき解く、2を底とする対数に直接採取間隔の長さと等しくなる場合。ここで、範囲[3,11]、分解インターバル長INT(ログ(11 - + 1 3))ログベース2 = 3、。

上記考え方によれば、分割された2つのセルの間の区間[x、y]を照会することができる[X、X + 2 ^ I - 1]および[Y - 2 ^ I + 1、y]は、そのFにターン相当で[ xは、i]およびF [Y - 2 ^ I + 1、i]は、このときの最小値範囲全体を解決するために、我々は2つだけの最小限の価値を必要とする、この時点で複雑さはO(1)です。

転載(http://blog.csdn.net/insistgogo/article/details/9929103

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;

#define N 2000

int stmax[N][20],stmin[N][20],mn[N];
int a[N];

int t,q,n;
int x,y;

void init()
{
    mn[0]=-1;
    for (int i=1;i<=n;i++)
    {
        mn[i]=((i & (i-1))==0) ? mn[i-1]+1 : mn[i-1];
        stmax[i][0]=stmin[i][0]=a[i];
    }
    for (int j=1;j<=mn[n];j++)
        for (int i=1;i+(1<<j)-1<=n;i++)
        {
            stmax[i][j]=max(stmax[i][j-1],stmax[i+(1<<(j-1))][j-1]);
            stmin[i][j]=min(stmin[i][j-1],stmin[i+(1<<(j-1))][j-1]);
        }
}

int rmq_max(int L,int R)
{
    int k=mn[R-L+1];
    return max(stmax[L][k],stmax[R-(1<<k)+1][k]);
}

int rmq_min(int L,int R)
{
    int k=mn[R-L+1];
    return min(stmin[L][k],stmin[R-(1<<k)+1][k]);
}

int main()
{
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        init();
        scanf("%d",&q);
        while (q--)
        {
            scanf("%d%d",&x,&y);
            printf("%d %d\n",rmq_max(x,y),rmq_min(x,y));
        }
    }
    return 0;
}
公開された41元の記事 ウォン称賛58 ビュー60000 +

ST表学習
効果:STアルゴリズムは、例えば、最小の用紙の所定の範囲RMQのために最大の価値を解決するために使用されています

例えば:

1の大部分の値は、配列A [〜5 0] = {5,4,6,10,1,12}、次いで区間[2,5]の間に与えられます。

方法:オフライン前処理(nlogn)とオンライン照会(O(1)):STアルゴリズムは、2つの部分に分割されます。あなたはまた、最も値の範囲を解決するなど、ツリーライン、ツリーのリストを、使用することができますが、STアルゴリズムは速くそれらよりもですが、また、オンラインでのお問い合わせのためのが。

(1)前処理オフライン:最も価値の間隔を解決するためのDPのアイデアの使用、および2次元配列に保存します。

(2)オンライン問い合わせ:所定の間隔ごとに分割され、最も値の2次元アレイによって

具体的な説明:

(1)前処理オフライン。

思想ST DPアルゴリズムは、一見間隔に属し、最も価値の間隔、動的計画法を解決するために、しかし、間隔が大きくなり、長さが増加していないたびにではなく、長さ2 ^私の増加を倍増する考え。

使用F [I、J]私は出発点として表さ、2 ^ J最も値区間の区間長、この時間間隔[I、I + 2 ^ J - 1]。

例えば、F [0,2]が4と等しい最小間隔[0,3]を表し、区間[2,5]を表すF [2,2]は最小値であり、すなわち、1に等しいです。

F [I、J]を解くときに、STは、2 ^ jの間隔の長さの最初のアルゴリズムである[I、I + 2 ^ J - 1]が2等分され、それぞれの長さが2 ^( - 1、J)であります。これら二つの部分のF値を解いた後、それぞれ[I、J - 1]およびF [I + 2 ^(j - 1)、J - 1]。最後に、これらの二つのセクションの中で最も値と組み合わせて、全範囲のために最大の価値を見つけます。特別な場合は、ときJ = 0、間隔の長さ、すなわち、唯一の素子間隔は、F [I、0]は各要素の値に等しくなければならない、1に等しいです。

例えば:最小要件ソリューションF [1,2]の値、すなわち、溶液間隔[1,4] = {} 4,6,10,1この時点で、このセクションを配置する必要があり、すなわち、等しい長さの2つのセクションに分割され[1,2]及び[3,4]は別々にこれらの二つのセクションの最小値を解決した後に、です。この時点で、これらの2つのセクションでは、最小値F [1,1]およびF [3,1]に対応します。

状態遷移方程式はFである[I、J] =分(F [I、J - 1]、F [I + 2 ^(j - 1)、J - 1])

初期状態:F [I、0] = A [i]に。

式再帰転送状態によれば、各要素は、最初に最も値の区分1の間隔長さ、間隔のその後の間隔の長さを見つけるし、次いで区間長に間隔4が最良の値を求めるその後、2の最良の値を求めます... 。、最後に、n個の要素の数を表す各LOG2の区間長後の溶液中の要素^ N最も値間隔、アルゴリズムの終了のため。

すなわち:シークするF [0] [1]、F [1] [1]、F [2] [1]、F [3] [1] ,,, F [N] [1]、その後シーク.F [0] [2]、F [1] [2]、F [2] [2]、F [3] [2] ,,, F [M] [2]、...

(2)オンライン処理:ここでは、最も値を解くこと、区間[X、Y]を照会することが知られています。

前処理中、間隔の長さに対応する各状態は、2 ^ Iです。間隔の長さは、クエリを与えられることにあるので、我々は、クエリ処理部を処理しなければならないので、必ずしも正確に2 ^私ではありません。

セル間の長さを必要とする前処理の結果を使用するために全体のゾーン(2)を覆うルーム(1)は、2つのセルの2つのセルは、2つの条件を満たしている間ここでは、2セルの間隔の間で分割されるクエリ彼らは等しく、2 ^ Iです。二つのセル間で重複してもよいことに留意されたいです。

例えば:[3,7]及び[8,11]に2つのアリコート間隔、最初のセットをしようとする区間[3,11]を、照会します。これら2つの間隔のさらなる拡張後2 ^ Iの許容長さに等しいです。それは2 ^ iは、になるまでの間隔の長さは、増加し続けた後わずか2は、それぞれ、区間長4及び5を分割しました。この時間間隔の最小の長さは、iが3 =とき、8つの出会う二つの条件です。

私は、直接プログラムはインターバルの長さを計算し、そう面倒ではない、我々はでき解く、2を底とする対数に直接採取間隔の長さと等しくなる場合。ここで、範囲[3,11]、分解インターバル長INT(ログ(11 - + 1 3))ログベース2 = 3、。

上記考え方によれば、分割された2つのセルの間の区間[x、y]を照会することができる[X、X + 2 ^ I - 1]および[Y - 2 ^ I + 1、y]は、そのFにターン相当で[ xは、i]およびF [Y - 2 ^ I + 1、i]は、このときの最小値範囲全体を解決するために、我々は2つだけの最小限の価値を必要とする、この時点で複雑さはO(1)です。

転載(http://blog.csdn.net/insistgogo/article/details/9929103

おすすめ

転載: blog.csdn.net/a1351937368/article/details/78400958