访问数组-1位置返回-1?

P3224 [HNOI2012] 永无乡

数组的 -1 位置是内存中存储数组开头的前一个位置,这个位置是不确定的值,不同编译器可能有不同结果
by Michaellg @ 2023-10-05 12:21:17


但是我交了很多发,都是AC了,这一点不知道能不能排除随机访问到非法位置的可能性 而且访问到-1不应该直接RE掉吗 就是这点很奇怪啊,洛谷评测机自己自适应了?
by SinCircle @ 2023-10-05 12:35:29


同问 不开O2全AC 开O2全MLE 代码如下 ```cpp #include<bits/stdc++.h> #define MAXN 100005 using namespace std; int n,m,q,cnt,p[MAXN],root[MAXN],fa[MAXN],bac[MAXN],ans; struct sgtree{ int lson,rson,sum; } tr[MAXN<<5]; inline int build(int l,int r,int val){ int now=++cnt; tr[now].sum=1; if(l==r) return now; int mid=(l+r)>>1; if(val<=mid) tr[now].lson=build(l,mid,val); else tr[now].rson=build(mid+1,r,val); return now; } inline int get(int x){ if(fa[x]==x) return x; return fa[x]=get(fa[x]); } inline int merg(int pl,int pr,int l,int r){ if(!(pl&&pr))return pl|pr; tr[pr].sum+=tr[pl].sum; int mid=(l+r)>>1; tr[pr].lson=merg(tr[pl].lson,tr[pr].lson,l,mid); tr[pr].rson=merg(tr[pl].rson,tr[pr].rson,mid+1,r); return pr; } inline int query(int p,int l,int r,int k){ if(!p) return -1; if(l==r) return l; int x=tr[tr[p].lson].sum,mid=(l+r)>>1; if(x>=k) query(tr[p].lson,l,mid,k); else query(tr[p].rson,mid+1,r,k-x); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&p[i]); bac[p[i]]=i; } for(int i=1;i<=n;i++){ fa[i]=i; root[i]=build(1,n,p[i]); } for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); x=get(x); y=get(y); merg(root[x],root[y],1,n); fa[x]=y; } scanf("%d",&q); for(int i=1;i<=q;i++){ char op[2]; int x,y; scanf("%s%d%d",op,&x,&y); if(op[0]=='B'){ x=get(x); y=get(y); merg(root[x],root[y],1,n); fa[x]=y; } else if(op[0]=='Q'){ x=get(x); ans=query(root[x],1,n,y); else printf("%d\n",bac[ans]); } } return 0; } ``` ~~会长的码就是写得比我好看~~
by 推翻暴政 @ 2023-10-09 20:29:46


下标本质是指针加减,如果没修改奇怪东西一般没事,好像 $\texttt{linux}$ 有时候会放过去(吧。打开 `-fsanitize=address` 运行时就会报错了。
by N2MENT @ 2023-11-13 19:45:49


@[推翻暴政](/user/448555) 您的query函数中要改成这样就没事了。 ```cpp inline int query(int p,int l,int r,int k){ if(!p) return -1; if(l==r) return l; int x=tr[tr[p].lson].sum,mid=(l+r)>>1; if(x>=k) return query(tr[p].lson,l,mid,k); else return query(tr[p].rson,mid+1,r,k-x); } ``` 原因是:因为返回值为 int 的函数没有返回值所以挂了。
by Hoks @ 2024-02-01 12:24:30


@[Hoks](/user/551100) thx
by 推翻暴政 @ 2024-03-01 15:06:23


|