51nod1174区间最大数(RMQ)

来源:互联网 发布:php 二进制转字符串 编辑:程序博客网 时间:2024/06/06 06:59

原题链接

无修改操作的最值查询问题,普通的RMQ最大值问题

代码如下:

#include <cstdio>#include <iostream>#include <cstring>#include <cctype>#include <cmath>#include <algorithm>#include <queue>#include <stack>#include <set>#include <map>#include <cstdlib>#include <vector>#define ll long long#define maxn 10010using namespace std;int a[maxn], d[maxn][20]; // 第二维大小应当估计log2(maxn)void init( int n){         // 初始化操作,a数组下标从0..n    for ( int i = 0; i < n; i++)        d[i][0] = a[i];    for ( int j = 1; ( 1 << j) <= n; j++){        for ( int i = 0; i + ( 1 << j) - 1 < n; i++)            d[i][j] = max( d[i][j - 1], d[i + ( 1 << ( j - 1))][j - 1]);    }}int RMQ( int l, int r){     // 查询操作,区间最小值    int k = 0;    while ( 1 << ( k + 1) <= r - l + 1) k++;    return max( d[l][k], d[r - ( 1 << k) + 1][k]);}int main(){int i, j, k, n, q;scanf( "%d", &n);for ( i = 0; i < n; i++){scanf( "%d", &a[i]);}init(n);scanf( "%d", &q);while ( q--){scanf( "%d%d", &i, &j);printf( "%d\n", RMQ( i, j)); }return 0;}


0 0
原创粉丝点击