范围最小值问题(RMQ)

给出一个数组,实现一个数据结构以支持查询操作Query(L, R):计算{AL, AL+1, ... , AR}

void RMQ_init(const vector<int>& A) {
    int n = A.size();
    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) <= n; i++)
           d[i][j] = min(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 min(d[L][k], d[R-(1<<k)][k]);
}

 

posted @ 2019-06-10 11:19  Hanasaki  阅读(181)  评论(0)    收藏  举报