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;
}