关于一些令人无比崩溃的问题(求解答为什么)(灵异代码)
  • 板块学术版
  • 楼主sbno333
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/6/1 01:51
  • 上次更新2024/6/1 10:11:15
查看原帖
关于一些令人无比崩溃的问题(求解答为什么)(灵异代码)
416975
sbno333楼主2024/6/1 01:51

这是今天 CF 的 D 的一份代码。

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
bool v[1000009];
int q[1000009];
int inn;
map<pii,bool> mp;
int h[5009];
struct st{
	int v,ne;
	bool c;
}sd[10000009];
void add(int u,int v){
	sd[++inn].v=v;
	sd[inn].ne=h[u];
	h[u]=inn;
	sd[inn].c=0;
}
int s[10000009];
int t;
void dfs(int u){
	/*if(u==1404){
		cout<<t<<endl;
		cout<<h[u]<<endl;//输出时输出 t,但该输出这个时 RE
	}*/
	for(int i=h[u]; i; i=h[u]){
		h[u]=sd[i].ne;
		if(!sd[i].c&&!mp[{u,sd[i].v}]&&!mp[{sd[i].v,u}]){
			sd[i].c=1;
			mp[{u,sd[i].v}]=1;mp[{sd[i].v,u}]=1;
			dfs(sd[i].v);
		}
	}
	s[++t]=u;
}
map<int,bool> zzz;
int ans[10000009];
int znn;
map<int,bool> zs;
void ck(int n){
	zs.clear();
	if(znn!=n){
		cout<<"false"<<endl;
	}else{
		for(int i=1;i<=n;i++){if(ans[i]>300000||ans[i]<2){
				cout<<"FALSE"<<endl;
				return;
			}
			if(i<n)
			if(zs[ans[i]*ans[i+1]]){
				cout<<"False"<<endl;
				cout<<i<<" "<<ans[i]<<" "<<ans[i+1]<<endl;
				return;
			}
			
			zs[ans[i]*ans[i+1]]=1;
		}
		cout<<"true"<<endl;
	}
}
void _main(){
	znn=0;
	mp.clear();
	inn+=3;
	while(inn--){
		sd[inn]={0,0,0};
	}
	memset(h,0,sizeof(h));
	t+=3;
	while(t--){
		s[t]=0;
	}
	t=0,inn=0;
	int n,nn;
	cin>>n;
	if(n==3){
		cout<<"2 2 3"<<endl;
		return;
	}
	nn=n;
	int m;
	m=1;
	for(int i=1;i<=5005;i++){
		if(i&1){
			if((i*i+i)/2>=n-1){
				m=i;
				break;
			}
		}else{
			if(i*i/2+1>=n-1){
				m=i;
				break;
			}
		}
	}
	
	mp.clear();
	for(int i=1;i<m;i++){
		for(int j=i+1;j<=m;j++){
			if(i!=j&&(m%2||j!=i+1||i%2==0||i==m-1)){
				add(i,j);
				add(j,i);
			}
		}
	}
	dfs(m);
	int p;
	p=0;
	while(n>0){
		cout<<q[s[++p]]<<" ";
		ans[++znn]=q[s[p]];
		n--;
		if(!zzz[q[s[p]]]&&n){
			cout<<q[s[p]]<<" ";
			ans[++znn]=q[s[p]];
			n--;
		}
		zzz[q[s[p]]]=1;
	}
	zzz.clear();
	cout<<endl;
	//ck(nn);
}
signed main(){
	v[1]=1;
	for(int i=2;i<=1000000;i++){
		if(!v[i]){
			q[++inn]=i;
		}
		for(int j=1;j<=inn&&q[j]*i<=1000000;j++){
			v[q[j]*i]=1;
			if(i%q[j]==0){
				break;
			}
		}
	}
	int t;
	cin>>t;
	while(t--){
		_main();
	}
	return 0;
}

现在有一条数据:

1 1000000

本地/莫 OJ 上测试莫名 RE,是在 dfs 过程中,某一时刻访问 h[1404] 时 RE,在此之前有访问过,详见代码注释部分。

更令人难以置信的是,CF 上该代码获得了 AC,并且将这个数据试图 hack 自己发生了 hack 失败(即程序能正确输出结果),想问一下是怎么回事。

  • 注:洛谷上运行提示时间超限
2024/6/1 01:51
加载中...