Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用稀疏表的范围最大和查询_C++_Range Query - Fatal编程技术网

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

C++ 使用稀疏表的范围最大和查询,c++,range-query,C++,Range Query,我使用稀疏表实现了范围最大和查询,我知道更有效的方法是使用段树 我所尝试的: 我正在计算I和j的所有可能值在(I,2^j-1)范围内的最大和,并将它们存储在表中 其中i是指数,j表示2的幂(2^j表示从i开始计算最大和的段长度) 现在使用上表,我们可以回答这些问题 输入: 三, -1 2 3 一, 1 2 预期产出: 二, 实际产量: “回答错误(垃圾值)” 实际上,我们必须告诉给定查询中的最大连续和 链接到问题 请帮助: #include<iostream> #include<

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

我所尝试的:

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

其中i是指数,j表示2的幂(2^j表示从i开始计算最大和的段长度)

现在使用上表,我们可以回答这些问题

输入:

三,

-1 2 3

一,

1 2

预期产出:

二,

实际产量:

“回答错误(垃圾值)”

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

请帮助:

#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;
}
#包括
#包括

#包括

如果您阅读了以上所有内容,您应该了解,为了让我们能够帮助您,您需要实际提出一个问题。您显示的代码有什么问题?你需要我们帮什么忙?代码是否给出生成错误?运行时崩溃?给出错误的结果?我得到了错误的答案,请编辑您的问题,向我们展示您对程序的输入,以及实际和预期的结果。我也建议你。为了帮助调试,将复杂的表达式拆分为更小更简单的表达式,以便能够看到中间结果。引用“但我的解决方案不起作用”这不是一个好的问题描述。你需要描述出哪里出了问题。例如:您的输入是什么?你的预期产出是多少?你的实际输出是什么?不要产生一堆代码,并想知道为什么它不工作。取而代之的是增量开发。从一个小的工作解决方案开始。然后分步展开,确保它一直工作。最终,您将得到一个完整的工作解决方案。这是一种称为逐步求精的程序开发方法的精髓,该方法由沃思在20世纪70年代引入。