我正在使用此段树实现来查找范围中的最大元素:
int TREE[10000000]={0};
int arr[100000];
int RMQ(int ss, int se, int qs, int qe, int index)
{
if (qs <= ss && qe >= se)
return TREE[index];
if (se < qs || ss > qe)
return INT_MIN;
int mid=ss+(se-ss)/2;
return max(RMQ(ss, mid, qs, qe, 2*index+1),(mid+1, se, qs,qe, 2*index+2));
}
int constructTree(int ss,int se,int si)
{
if (ss == se)
{
TREE[si] = arr[ss];
return arr[ss];
}
int mid=ss+(se-ss)/2;
TREE[si]= max(constructTree(ss,mid,si*2+1),constructTree(mid+1, se,si*2+2));
return TREE[si];
}
主要是我做这样的事情:
int N,M;
cin>>N>>M;
for(int i=0;i<N;i++){
cin>>arr[i];
}
constructTree(0,N-1,0);
while(M--){
int L,R;
cin>>L>>R;
cout<<RMQ(0,N-1,L-1,R-1,0)<<endl;
}
但它给出了错误的结果。对于输入N = 5和M = 1而数组为[3,1,3,2,1],对于查询L = 1,R = 1,它给出8.请帮助查找错误。
我无法找到我的代码有什么问题:(
答案 0 :(得分:0)
关于该代码最糟糕的事情必须是你的名字。它们毫无意义,请学会为您的实体提供适当的名称。它将帮助您调试并减少引入错误的机会。你还应该改进你的缩进。
这些也会让人们更有可能在将来回答您的问题,因为他们更容易理解您发布的代码。
int TREE[10000000]={0};
int arr[100000];
如果您的数组只能包含100 000
元素,则您的细分树不需要保留10 000 000
。我很惊讶你的程序没有崩溃,那几乎是40 MB。
如果您有n
个元素并且您不想担心检查超出范围的索引,则可以声明大小为2^k >= 2*n-1
的树。在您的情况下,这将是{{1} }。
除此之外,这看起来不对:
2^18 = 262 144
应该是,如果我对你的神秘符号有正确的话:
if (qs <= ss && qe >= se)
下一个条件:
if (qs >= ss && se <= qe)
看起来不错。