ST表模板(維護區間最大值)

衆所周知,ST表可以用來維護任意一段區間的最大最小值。ST表的狀態可以描述爲從i開始區間長度爲2^j的區間。因此核心代碼爲

for(int j = 0; j< log(n);j++)
    for(int i = 0 ; i< n;i++)
        f[i][j] = min(f[i][j-1], f[i+2^j][j-1];
// 模板:(維護區間最大值的ST表)
#include<iostream>
using namespace std;
int ST[5005][5005] ,pre[5005],pre2[5005];
int a[5005];
int n;


void makeST()
{
  pre[0]=1;for(int i=1;i<=20;i++) pre[i]=pre[i-1]<<1;
  pre2[0]=-1;for(int i=1;i<=n;i++) pre2[i]=pre2[i>>1]+1;
  for(int i=1;i<=n;i++) ST[i][0]=i;
  for(int j=1;j<=20;j++)
    for(int i=1;i<=n;i++){
      if(i+pre[j]-1<=n){
       int x1=ST[i][j-1],x2=ST[i+pre[j-1]][j-1];
       if(a[x1]>a[x2]) ST[i][j]=x1;
       else ST[i][j]=x2;
      }
    }
}
int query(int l,int r)
{
  if(l==r)return l;
  int x=pre2[r-l+1];
  int x1=ST[l][x],x2=ST[r-pre[x]+1][x];
  return a[x1]>a[x2]?x1:x2;
}
int main()
{
    cin>>n;
    for(int i = 0; i< n; i++)
    {
        cin>>a[i]; 
    }   
    makeST();
    int x,y;
    while(cin>>x>>y)
    cout<<"max index is "<<query(x,y)<<endl<<"max value is "<<a[query(x,y)]<<endl;
    return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章