最近对 testlib 的 I/O 交互方面比较感兴趣,官方文档也看懂了,比如 P1733 这道题,交互库的代码也看懂了,但是怎么在本地运行呢?
如果我交互库 lib.cpp 这么写:
#include "testlib.h"
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define FRR(file) freopen(file,"r",stdin)
#define FRW(file) freopen(file,"w",stdout)
#define _rep(i,a,b) for (int i=(a);i<=(b);++i)
#define _reps(i,a,b,c) for (int i=(a);i<=(b);c)
#define _rrep(i,a,b) for (int i=(a);i>=(b);--i)
#define _rreps(i,a,b,c) for (int i=(a);i>=(b);c)
#define _iter(i,a) for (auto i=a.begin();i!=a.end();++i)
#define _graph(i,u) for (int i=h[u];~i;i=ne[i])
#define rint register int
#define LL long long
typedef pair<int,int> pii;
LL result; // [1,1e18]
int cnt;
int maxCnt=60;
int main(int argc,char* argv[]) {
registerInteraction(argc,argv);
result=inf.readLong();
cout.flush();
while (true) {
int op;
LL n;
op=ouf.readInteger(1,2);
n=ouf.readLong(1,1000000000000000000);
ouf.readEoln();
if (op==2) {
if (n==result && cnt<=maxCnt) quitf(_ok,"Accepted! 0");
else quitf(_wa,"Wrong Answer 1");
}
cnt++;
if (n>result) cout<<1<<endl;
else if (n<result) cout<<-1<<endl;
else cout<<0<<endl;
cout.flush();
}
}
用户代码 user.cpp 这么写:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define FRR(file) freopen(file,"r",stdin)
#define FRW(file) freopen(file,"w",stdout)
#define TIMESTAMP cerr<<fixed<<setprecision(3)<<clock()*1.0/CLOCKS_PER_SEC<<"s"<<endl;
#define _rep(i,a,b) for (int i=(a);i<=(b);++i)
#define _reps(i,a,b,c) for (int i=(a);i<=(b);c)
#define _rrep(i,a,b) for (int i=(a);i>=(b);--i)
#define _rreps(i,a,b,c) for (int i=(a);i>=(b);c)
#define _iter(i,a) for (auto i=a.begin();i!=a.end();++i)
#define _graph(i,u) for (int i=h[u];~i;i=ne[i])
#define rint register int
#define LL long long
typedef pair<int,int> pii;
int ask(int k) {
printf("1 %lld\n",k);
fflush(stdout);
int res;
scanf("%lld",&res);
return res;
}
void get(int k) {
printf("2 %lld\n",k);
fflush(stdout);
}
signed main() {
fflush(stdout);
int l=1,r=1000000000000000000;
while (l<r) {
int mid=l+r>>1;
int k=ask(mid);
if (k==0) {
get(mid);
return 0;
} else if (k<0) l=mid+1;
else r=mid;
}
get(r);
return 0;
}
我想用 CMD 命令行运行,如何使它们成功交互起来?
给出一些或许有用的信息:
要猜的数字 data.in
评测机向用户程序发送的内容 toUser.out
用户程序向评测机发送的内容 toLib.out
testlib quitf 反馈的结果文件 data.res