SPJ
#include "testlib.h"
#include<iostream>
#include<string>
std::string a,b;
int main(int argc,char *argv[]){
int x;
registerInteraction(argc,argv);
while(!inf.eof()&&(x=inf.readInt(),~x)) printf("%d ",x);
for(int i=0;i<100;++i) printf("-1 ");
fflush(stdout);
fflush(stdin);
a=ouf.readToken();
b=ouf.readLine();
if(a=="_ok") quitf(_ok,b.c_str());
else quitf(_wa,b.c_str());
return 0;
}
交互库
#include<bitset>
#include<vector>
#include<climits>
#include<algorithm>
std::bitset<2000> _v[4009],_r[109];
int _o[4009],_t[4009],_x[4009],_y[4009],_l,_s,_n,_k,_q,_a[109],_c[109];
#define quitf(x,y) printf("%s " y,#x),fflush(stdout),exit(0)
void construct_instructions(int s,int n,int k,int q);
void append_move(int t,int y){
++_l;if(_l>_q) quitf(_wa,"Too many instructions");
if(t<0||t>=100||y<0||y>=100) quitf(_wa,"Invalid index");
_o[_l]=1,_t[_l]=t,_y[_l]=y;
}
void append_store(int t,std::vector<bool> v){
++_l;if(_l>_q) quitf(_wa,"Too many instructions");
if(v.size()!=2000) quitf(_wa,"Value to store is not b bits long");
for(int i=0;i<2000;++i) _v[_l][i]=v[i];
_o[_l]=2,_t[_l]=t;
}
void append_and(int t,int x,int y){
++_l;if(_l>_q) quitf(_wa,"Too many instructions");
if(t<0||t>=100||x<0||x>=100||y<0||y>=100) quitf(_wa,"Invalid index");
_o[_l]=3,_t[_l]=t,_x[_l]=x,_y[_l]=y;
}
void append_or(int t,int x,int y){
++_l;if(_l>_q) quitf(_wa,"Too many instructions");
if(t<0||t>=100||x<0||x>=100||y<0||y>=100) quitf(_wa,"Invalid index");
_o[_l]=4,_t[_l]=t,_x[_l]=x,_y[_l]=y;
}
void append_xor(int t,int x,int y){
++_l;if(_l>_q) quitf(_wa,"Too many instructions");
if(t<0||t>=100||x<0||x>=100||y<0||y>=100) quitf(_wa,"Invalid index");
_o[_l]=5,_t[_l]=t,_x[_l]=x,_y[_l]=y;
}
void append_not(int t,int x){
++_l;if(_l>_q) quitf(_wa,"Too many instructions");
if(t<0||t>=100||x<0||x>=100) quitf(_wa,"Invalid index");
_o[_l]=6,_t[_l]=t,_x[_l]=x;
}
void append_left(int t,int x,int p){
++_l;if(_l>_q) quitf(_wa,"Too many instructions");
if(t<0||t>=100||x<0||x>=100) quitf(_wa,"Invalid index");
if(p<0||p>2000) quitf(_wa,"Invalid shift value");
_o[_l]=7,_t[_l]=t,_x[_l]=x,_y[_l]=p;
}
void append_right(int t,int x,int p){
++_l;if(_l>_q) quitf(_wa,"Too many instructions");
if(t<0||t>=100||x<0||x>=100) quitf(_wa,"Invalid index");
_o[_l]=8,_t[_l]=t,_x[_l]=x,_y[_l]=p;
}
void append_add(int t,int x,int y){
++_l;if(_l>_q) quitf(_wa,"Too many instructions");
if(t<0||t>=100||x<0||x>=100||y<0||y>=100) quitf(_wa,"Invalid index");
_o[_l]=9,_t[_l]=t,_x[_l]=x,_y[_l]=y;
}
void append_print(int t){//do nothing
}
int main(){
scanf("%d%d%d%d",&_s,&_n,&_k,&_q);
construct_instructions(_s,_n,_k,_q);
while(scanf("%d",_a),~_a[0]){
for(int i=1;i<_n;++i) scanf("%d",_a+i);
for(int i=0;i<_n;++i) _r[i].reset();
for(int i=0;i<_n;++i) for(int j=0;j<_k;++j) _r[0][i*_k+j]=((_a[i]&(1<<j))!=0);
for(int i=1;i<=_l;++i){
switch(_o[i]){
case 1:{//move
_r[_t[i]]=_r[_y[i]];
break;
}
case 2:{//store
_r[_t[i]]=_v[i];
break;
}
case 3:{//and
_r[_t[i]]=_r[_x[i]]&_r[_y[i]];
break;
}
case 4:{//or
_r[_t[i]]=_r[_x[i]]|_r[_y[i]];
break;
}
case 5:{//xor
_r[_t[i]]=_r[_x[i]]^_r[_y[i]];
break;
}
case 6:{//not
_r[_t[i]]=~_r[_x[i]];
break;
}
case 7:{//left
_r[_t[i]]=_r[_x[i]]<<_y[i];
break;
}
case 8:{//right
_r[_t[i]]=_r[_x[i]]>>_y[i];
break;
}
case 9:{//add
bool s=0;
for(int j=0;j<2000;++j) _r[_t[i]][j]=(s^_r[_x[i]][j]^_r[_y[i]][j]),s=(s&_r[_x[i]][j])|(s&_r[_y[i]][j])|(_r[_x[i]][j]&_r[_y[i]][j]);
break;
}
}
}
for(int i=0;i<_n;++i){
_c[i]=0;
for(int j=0;j<_k;++j) _c[i]|=(_r[0][i*_k+j]<<j);
}
if(_s==0){
int _p=INT_MAX;
for(int i=0;i<_n;++i) _p=std::min(_p,_a[i]);
if(_c[0]!=_p) quitf(_wa,"s=0, but c[0]!=min{a}");
}
else{
std::stable_sort(_a,_a+_n);
for(int i=0;i<_n;++i) if(_c[i]!=_a[i]) quitf(_wa,"s=1, but c[i]!=(i+1)th of {a}");
}
}
quitf(_ok,"You are right!!!");
return 0;
}