$$ \newcommand{\seq}[2]{{#1}_{1},{#1}_{2},\cdots,{#1}_{#2}} \newcommand{\num}[1]{1,2,\cdots,#1} \newcommand{\stra}[2]{\begin{bmatrix}#1 \\ #2\end{bmatrix}} \newcommand{\strb}[2]{\begin{Bmatrix}#1 \\ #2\end{Bmatrix}} \newcommand{\dw}[1]{\underline{#1}} \newcommand{\up}[1]{\overline{#1}} $$

Codeforces 1103

A.

水题

Code

#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	cin>>s;
	int cnt0=0,cnt1=0;
	for(char i:s){
		if(i=='0')cout<<(cnt0?"1 1\n":"3 1\n"),cnt0^=1;
		else cout<<(cnt1?"1 1\n":"1 3\n"),cnt1^=1;
	}
	return 0;
}

B.

特判 \(a=1\)
先询问 \((i,2i)\) 倍增出一个区间 \(2^x,2^{x+1}\) ,然后询问 \((2^x,2^x+i)\) 二分出答案。
正确性请自行理解。

Code

#include<bits/stdc++.h>
using namespace std;
char s[10];
char query(int x,int y){
	printf("? %d %d\n",x,y);
	fflush(stdout);
	scanf("%s",s);
	if(*s=='e')exit(0);
	return *s;
}
int main(){
	while(scanf("%s",s),*s=='s'){
		if(query(0,1)=='x'){
			printf("! 1\n");
			fflush(stdout);
			continue;
		}
		int i;
		for(i=2;;i*=2){
			if(query(i,i/2)=='y')break;
		}
		int l=i/2,r=i,mid,ans=-1;
		while(l<=r){
			mid=(l+r)>>1;
			if(query(mid,i/2)=='y')ans=mid,r=mid-1;
			else l=mid+1;
		}
		printf("! %d\n",ans);
		fflush(stdout);
	}
	return 0;
}

C.

posted @ 2019-09-18 20:58  chc_1234567890  阅读(88)  评论(0编辑  收藏  举报