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
":"3 1
"),cnt0^=1;
else cout<<(cnt1?"1 1
":"1 3
"),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
",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
");
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
",ans);
fflush(stdout);
}
return 0;
}