为什么这样的代码会出现RUNTIME ERROR?
void create(int l,int r,int rt)
{
num[rt][0]=0;
if(l==r) return;
int mid=(l+r)>>1;
int ll=l,rr=mid+1;
int isame=mid-l+1;
int same=0;
int i;
for(i=l;i<=r;i++)
{
if(i==1) num[rt][i]=0;
else num[rt][i]=num[rt][i-1];
if(val[rt][i]<sorted[mid])
{
same++;
num[rt][i]++;
val[rt+1][ll++]=val[rt][i];
}
else if(val[rt][i]>sorted[mid]) val[rt+1][rr++]=val[rt][i];
else
{
if(same<isame) {same++;num[rt][i]++;val[rt+1][ll++]=val[rt][i];}
else val[rt+1][rr++]=val[rt][i];
}
}
create(l,mid,rt+1);
create(mid+1,r,rt+1);
}
这是划分树的建树代码,isame是为了确定如果出现好几个值与sorted[mid]相同的时候,是归到左子树还是右子树。我觉得这样的处理方式没有错,但是交到OJ上却出现了RE。但是如果改成这样就没有错。
void create(int l,int r,int rt)
{
num[rt][0]=0;
if(l==r) return;
int mid=(l+r)>>1;
int ll=l,rr=mid+1;
int same=mid-l+1;
int i;
for(i=l;i<=r;i++) if(val[rt][i]<sorted[mid]) same--;
for(i=l;i<=r;i++)
{
if(i==1) num[rt][i]=0;
else num[rt][i]=num[rt][i-1];
if(val[rt][i]<sorted[mid])
{
num[rt][i]++;
val[rt+1][ll++]=val[rt][i];
}
else if(val[rt][i]>sorted[mid]) val[rt+1][rr++]=val[rt][i];
else
{
if(same) {same--;num[rt][i]++;val[rt+1][ll++]=val[rt][i];}
else val[rt+1][rr++]=val[rt][i];
}
}
create(l,mid,rt+1);
create(mid+1,r,rt+1);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论