我正在尝试使用段树解决 SPOJ 问题GSS1(你能回答这些查询吗)。我正在使用“init”方法来初始化树,并使用“query”方法来获取范围 [i,j] 中的最大值。
限制 |A[i]| <= 15707 和 1<=N(元素数)<=50000。
int A[50500], tree[100500];
void init(int n, int b, int e) // n=1, b=lower, e=end
{
if(b == e)
{
tree[n] = A[b];
return;
}
init(2 * n, b, (b + e) / 2);
init(2 * n + 1, ((b + e) / 2) + 1, e);
tree[n] = (tree[2 * n] > tree[2 * n + 1]) ? tree[2 * n] : tree[2 * n + 1];
}
int query(int n, int b, int e, int i, int j) // n=1, b=lower, e=end, [i,j]=range
{
if(i>e || j<b)
return -20000;
if(b>=i && e<=j)
return tree[n];
int p1 = query(2 * n, b, (b + e) / 2, i, j);
int p2 = query(2 * n + 1, ((b + e) / 2) + 1, e, i, j);
return (p1 > p2) ? p1 : p2;
}
程序给出了错误的答案。我调试了大多数情况下的代码(负数、奇数/偶数 N),但我无法弄清楚算法有什么问题。
如果有人能指出我正确的方向,我将不胜感激。
谢谢