使用稀疏表的范围最大和查询

时间:2019-01-20 08:20:13

标签: c++ range-query

我使用稀疏表实现了范围最大和查询,我知道更有效的方法是使用分段树。

我尝试过的事情:

我正在计算i和j的所有可能值在(i,2^j-1)范围内的最大和并将它们存储在表中

其中i是索引,j表示2的幂(2 ^ j表示从i中我们正在计算最大和的段的长度)

现在使用上表,我们可以回答查询

输入:

  

3

     

-1 2 3

     

1

     

1 2

预期输出:

  

2

实际输出:

  

“错误答案(垃圾价值)”

我们实际上必须告诉给定查询中的最大连续和 链接到问题spoj gss1

请帮助:

#include<iostream>
#include<vector>
#include<algorithm>
#include<climits>
using namespace std;
const int k = 16;
const int N = 1e5;
const int ZERO = 0; // ZERO + x = x + ZERO = x (for any x)

long long table[N][k + 1]; // k + 1 because we need to access table[r][k]
long long  Arr[N];

int main()
{
    int n, L, R, q;
    cin >> n; // array size
    for(int i = 0; i < n; i++)
        cin >> Arr[i];

    // build Sparse Table
    for(int i = 0; i < n; i++)
        table[i][0] = Arr[i];

    for(int j = 1; j <= k; j++) {
        for(int i = 0; i <= n - (1 << j); i++)
            //table[i][j] = table[i][j - 1] + table[i + (1 << (j - 1))][j - 1];
            table[i][j] = max(table[i][j-1],max(table[i+(1<<(j-1))][j-1],table[i+(1<<(j-1))][j-1]+table[i][j-1]));
    }

    cin >> q; // number of queries
    for(int i = 0; i < q; i++) {
        cin >> L >> R; // boundaries of next query, 0-indexed
        long long int answer = LLONG_MIN;
        for(int j = k; j >= 0; j--) {
            if(L + (1 << j) - 1 <= R) {
                answer = max(answer,answer + table[L][j]);
                L += 1 << j; // instead of having L', we increment L directly
            }
        }
        cout << answer << endl;
    }
    return 0;
}

链接到问题Spoj Gss1

0 个答案:

没有答案