提供一个数据生成器
查看原帖
提供一个数据生成器
163337
Zpair楼主2023/12/4 17:34

保证数据有解了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 200005
mt19937_64 rnd(random_device{}());
ll Rand(ll x,ll y){return rnd()%(y-x+1)+x;}
FILE *p;
int sx[MAXN],sy[MAXN],n,m;
ll qt[MAXN],qx[MAXN],qy[MAXN];
void gen(int n,int m,ll v){
	p=fopen("xx.in","w");
	m=Rand(1,m);
	fprintf(p,"%d %d\n",n,m);
	for(int i=1;i<=m;++i){
		int t=Rand(1,4);
		if(t==1)sx[i]=1,sy[i]=0;
		if(t==2)sx[i]=-1,sy[i]=0;
		if(t==3)sx[i]=0,sy[i]=1;
		if(t==4)sx[i]=0,sy[i]=-1;
	}
	for(int i=1;i<=m;++i)
		sx[i]+=sx[i-1],sy[i]+=sy[i-1];
	for(int i=1;i<=n;++i){
		ll t=Rand(1,v);
		ll x=sx[m]*(t/m)+sx[t%m];
		ll y=sy[m]*(t/m)+sy[t%m];
		fprintf(p,"%lld %lld %lld\n",t,x,y);
		qt[i]=t,qx[i]=x,qy[i]=y;
	}
	::n=n,::m=m;
	fclose(p);
}
char s1[MAXN],s2[MAXN];
bool check(){
	FILE *p=fopen("1.out","r");
	fscanf(p,"%s",s1+1);
	fclose(p);
	FILE *p2=fopen("2.out","r");
	fscanf(p2,"%s",s2+1);
	fclose(p2);
	if((s1[1]=='N')==(s2[1]=='N')){
		if(s1[1]=='N')return 1;
		int mm=strlen(s1+1);
		if(m!=mm)return 0;
		for(int i=1;i<=m;++i){
			char t=s1[i];
			if(t=='R')sx[i]=1,sy[i]=0;
			if(t=='L')sx[i]=-1,sy[i]=0;
			if(t=='U')sx[i]=0,sy[i]=1;
			if(t=='D')sx[i]=0,sy[i]=-1;
		}
		for(int i=1;i<=m;++i)
			sx[i]+=sx[i-1],sy[i]+=sy[i-1];
		for(int i=1;i<=n;++i){
			ll t=qt[i];
			ll x=sx[m]*(t/m)+sx[t%m];
			ll y=sy[m]*(t/m)+sy[t%m];
			if(x!=qx[i]||y!=qy[i])
				return 0;
		}
		return 1;
	}
	else return 0;
}
signed main(){
	for(int i=1;i;++i){
		gen(200000,200000,1e18);
		system("1 < xx.in > 1.out");
		system("2 < xx.in > 2.out");
		if(!check()){
			cout<<"WA\n";
			return 0;
		}
		printf("AC on #%d\n",i);
	}
}
2023/12/4 17:34
加载中...