用法:程序复制到本地,将调用 system 函数那一行的 ./zc 换成自己的(例如 windows
下可能是 ppip.exe
或 ppip
)程序执行命令,运行即可。
会在文件夹下生成 1.in
和 1.out
,分别为出错的输入和错误输出。
#include <bits/stdc++.h>
using namespace std;
template <typename T>
void read(T& x) {
char c;int f{1};
do x=(c=getchar())^48;
while (!isdigit(c)&&c!='-');
if (x==29) f=-1,x=0;
while (isdigit(c=getchar()))
x=(x<<3)+(x<<1)+(c^48);
x*=f;
}
template <typename T,typename ...Args>
void read(T& x,Args&... args) {read(x);read(args...);}
mt19937 rnd(chrono::system_clock::now().time_since_epoch().count());
int randint(int l,int r) {return rnd()%(r-l+1)+l;}
const int N{27};
int a[N+5];
deque<int> q[10];
int main() {
int Q{0};
while (true) {
Q+=1;
int T{1};
freopen("1.in","w",stdout);
printf("%d\n",T);
// while (T--) {
int n{randint(2,3)},m{0},k{2*n-1};
for (int i{1};i<=k;++i)
for (int j{1},w{(randint(1,4)>>2)+1<<1};j<=w;++j) // 生成多对卡牌的概率,因为过大不方便调试所以开的 1/4
a[++m]=i;
shuffle(a+1,a+1+m,rnd);
printf("%d %d %d\n",n,m,k);
for (int i{1};i<=m;++i) printf("%d ",a[i]);
puts("");
fclose(stdout);
system("./zc < 1.in > 1.out");
freopen("1.out","r",stdin);
int op;read(op);
if (op<m||op>m*2) {
fprintf(stderr,"E: operation number out of range.");
return 0;
}
int pt{1};
while (op--) {
int o;read(o);
if (o==1) {
if (pt>m) {
fprintf(stderr,"E: number of op 1 out of range.");
return 0;
}
int x,y{a[pt++]};read(x);
if (q[x].size()&&q[x].back()==y) q[x].pop_back();
else q[x].push_back(y);
} else {
int x,y;read(x,y);
if (q[x].empty()||q[y].empty()) {
fprintf(stderr,"E: stack empty when executing op 2.");
return 0;
}
if (q[x].front()==q[y].front()) q[x].pop_front(),q[y].pop_front();
}
}
for (int i{1};i<=n;++i)
if (q[i].size()) {
fprintf(stderr,"Wrong Answer.");
return 0;
}
// }
fprintf(stderr,"AC on #%d\n",Q);
}
return 0;
}
以下为使用 testlib
编写的 checker,用于找到错误数据后进一步调试。
#include "testlib.h"
#include <bits/stdc++.h>
using namespace std;
constexpr int N{305};
deque<int> Q[N];
int main(int argc,char *argv[]) {
registerTestlibCmd(argc, argv);
int T;
T=inf.readInt();
for (int _{1};_<=T;++_) {
int n{inf.readInt()},m{inf.readInt()},k{inf.readInt()};
queue<int> q;
for (int i{1};i<=m;++i) q.push(inf.readInt());
int op{ouf.readInt(m,2*m)};
for (int i{1};i<=op;++i) {
int o{ouf.readInt(1,2)};
if (o==1) {
int z{ouf.readInt(1,n)};
int w{q.front()};q.pop();
if (Q[z].size()&&Q[z].back()==w) Q[z].pop_back();
else Q[z].push_back(w);
} else {
int l{ouf.readInt(1,n)},r{ouf.readInt(1,n)};
quitif(Q[l].empty()||Q[r].empty()||Q[l].front()!=Q[r].front(),_wa,"Invalid operation 2 #(%d, %d): %d %d.",_,i,l,r);
Q[l].pop_front();
Q[r].pop_front();
}
// cerr<<endl;
// cerr<<"Operation #"<<i<<endl;
// for (int i{1};i<=n;++i) {
// cerr<<"Stack "<<i<<": ";
// for (auto v:Q[i]) cerr<<v<<", ";
// cerr<<endl;
// }
}
for (int i{1};i<=n;++i)
quitif(Q[i].size(),_wa,"Stack %d not empty #%d.",i,_);
}
quit(_ok,"Accepted.");
return 0;
}
开发者:Federico2903 & Murasame & quanac-lcx