提供交互库
查看原帖
提供交互库
676498
封禁用户楼主2024/1/9 07:36

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;
}
2024/1/9 07:36
加载中...