关于交互题的语言选择
查看原帖
关于交互题的语言选择
577880
cjh20090318楼主2025/8/30 21:44

为什么同样一份代码,在 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]);
}
2025/8/30 21:44
加载中...