保证数据有解了。
#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);
}
}