RMQ

1、朴素(即搜索),O(n)-O(qn) online。

 

2、线段树,O(n)-O(qlogn) online。

 

3、ST(实质是动态规划),O(nlogn)-O(1) online。

View Code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include<map>
#include<time.h>
#include<set>
#include<algorithm>
using namespace std;


int v[1000];
int f[1000][1000];
int N;
/*
f[i][j]表示 A[i]到 A【 i + 2 ^ j - 1]的最大值
思想:
分治动态规划思想,分成左右两部分 
f[i][j] = max( f[i][j-1], f[i + 2 ^ ( j - 1)][j-1])
f[i][0] = A[i];
 
*/

void pre( )
{ 
  for( int i = 1; i <= N; i++)
  {
     f[i][0] = v[i];
  }
  for( int j = 1; j <= log(N) / log(2); j++)
  {
     for( int i = 1; i <= N + 1 - (1<<j); i++)
        f[i][j] = max( f[i][j-1],f[ i + (1<<(j-1))][j-1]); 
  }
}

int query( int L, int R )
{
   int x = (int) log( R - L + 1 ) / log( 2 );
   return max(f[L][x], f[R+1- (1<<x)][x]);
}
 
int main( )
{
  int a, b;
  while( scanf("%d",&N) != EOF)
  {  
    srand(time(NULL));
    for( int i = 1; i <= N; i++)
    {
       v[i] = rand( ) % 1000;
       printf("%d ",v[i]);
       if( i % 10 == 0 ) 
           puts("");
    }
    pre( );
    while( 1 )
    {
       scanf("%d%d",&a,&b);
       printf("%d\n",query(a,b));    
           
    }       
  }
  return 0;
}

 

 

 

posted on 2012-08-01 16:30  more think, more gains  阅读(190)  评论(0编辑  收藏  举报

导航