我正在尝试构建一个稀疏表来处理 RMQ。
但由于某种原因,它在输出结束时不断返回不需要的额外值。
例如,如果输入是:
8
8 5 3 9 7 3 4 2
2
1 7
2 8
那么输出应该是:
8 5 3 9 7 3 4 2
5 3 3 7 3 3 2
3 3 3 3 2
2
但它返回的是这个:
8 5 3 9 7 3 4 2
5 3 3 7 3 3 2
3 3 3 3 2
2
5
这是我的代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000;
const int LOG = 10;
int st[MAXN][LOG];
int a[MAXN];
int manglog[MAXN + 1];
void logs(int n) {
manglog[1] = 0;
for (int i = 2; i <= n; i++) {
manglog[i] = manglog[i / 2] + 1;
}
}
void sparse(int n) {
for (int i = 1; i <= n; i++) {
st[0][i] = a[i];
}
for (int p = 1; p <= __lg(n); p++) {
for (int i = 1; i + (1 << p) <= n+1; i++) {
st[p][i] = min(st[p-1][i], st[p-1][i + (1 << (p-1))]);
}
}
for(int p = 0; p <= __lg(n); p++) {
for (int i = 1; i + (1 << p) <= n+1; i++) {
cout << st[p][i];
if (i + (1 << p) <= n) {
cout << " ";
}
}
cout << endl;
}
}
int minntv(int L, int R) {
int j = manglog[R - L + 1];
return min(st[j][L], st[j][R - (1 << j) + 1]);
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
logs(n); sparse(n);
int l, r;
cin >> l >> r;
cout << minntv(l, r) << endl;
return 0;
}
我尝试过的:
Verified the loop conditions to ensure they don't go beyond the range of the array.
Checked the logic used to initialize and populate the Sparse Table.
我的期望:我期望稀疏表能够正确构建,并且该函数仅打印最小值,最后没有任何额外的值。
实际发生的情况:该函数打印了正确的值,但在输出末尾包含了一个附加值。
为什么使用这条线? 计算<< minntv(l, r) << endl; this line outputs "5" is this right?