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) 编辑 收藏 举报