为什么同样一份代码,在 C++14 (GCC 9) 下全部测试点运行时错误,但是可以在 C++14 下通过?
其中运行时错误的反馈信息如下:
Runtime Error.wrong answer Interactor Error
Received signal 11: Segmentation fault with invalid memory reference.
//the code is from chenjh
#ifdef ONLINE_JUDGE
void solve(int N);
int query(int s, int t);
void answer(int i, int a);
#else
#include "xylophone.h"
#endif
#include<algorithm>
#define MAXN 5005
using namespace std;
int a[MAXN];
bool b[MAXN];
void solve(int N){
int x;
for(x=2;x<=N&&query(1,x)<N-1;x<<=1);
x>>=1;
for(int k=__lg(x)-1;k>=0;--k)if((x|(1<<k))<=N&&query(1,x|(1<<k))<N-1) x|=1<<k;
++x;
b[a[x]=N]=1;
for(int i=x+1;i<=N;i++){
int r1=query(i-1,i);
if(0<a[i-1]-r1&&a[i-1]-r1<=N&&0<a[i-1]+r1&&a[i-1]+r1<=N){
if(!b[a[i-1]-r1]&&!b[a[i-1]+r1]){
int r2=query(i-2,i);
int mx=max(a[i-2],a[i-1]),mn=min(a[i-2],a[i-1]);
if(r2==max(mx,a[i-1]-r1)-min(mn,a[i-1]-r1)) b[a[i]=a[i-1]-r1]=1;
else b[a[i]=a[i-1]+r1]=1;
}
else if(!b[a[i-1]-r1]) b[a[i]=a[i-1]-r1]=1;
else if(!b[a[i-1]+r1]) b[a[i]=a[i-1]+r1]=1;
}
else if(0<a[i-1]-r1&&a[i-1]-r1<=N) b[a[i]=a[i-1]-r1]=1;
else if(0<a[i-1]+r1&&a[i-1]+r1<=N) b[a[i]=a[i-1]+r1]=1;
}
for(int i=x-1;i>0;--i){
int r1=query(i,i+1);
if(0<a[i+1]-r1&&a[i+1]-r1<=N&&0<a[i+1]+r1&&a[i+1]+r1<=N){
if(!b[a[i+1]-r1]&&!b[a[i+1]+r1]){
int r2=query(i,i+2);
int mx=max(a[i+2],a[i+1]),mn=min(a[i+2],a[i+1]);
if(r2==max(mx,a[i+1]-r1)-min(mn,a[i+1]-r1)) b[a[i]=a[i+1]-r1]=1;
else b[a[i]=a[i+1]+r1]=1;
}
else if(!b[a[i+1]-r1]) b[a[i]=a[i+1]-r1]=1;
else if(!b[a[i+1]+r1]) b[a[i]=a[i+1]+r1]=1;
}
else if(0<a[i+1]-r1&&a[i+1]-r1<=N) b[a[i]=a[i+1]-r1]=1;
else if(0<a[i+1]+r1&&a[i+1]+r1<=N) b[a[i]=a[i+1]+r1]=1;
}
for(int i=1;i<=N;i++) answer(i,a[i]);
}