题意
题解
第一次做交互题。
要求60次询问之内出结果。可以想到大概用的就是二分之类的方法。
考虑二分,每次怎么才能判断
[L,mid]
和
[mid+1,R]
哪一部分一定有点呢?
比较巧妙的办法,询问
(mid,mid+1)
,就能判断离中间最近的是在哪边,往那一边走一定能找到。
题目要求的是找到两个点,我们先
get(1,n)
找到第一个点
ans1
,然后
get(1,ans1−1)
,如果找不到就
get(ans1+1,n)
。这样一定能完成任务。
#include<cstdio>
#include<algorithm>
using namespace std;
int Query(int x,int y){ // 1: |x..| <= |y..|
printf("1 %d %d\n",x,y); fflush(stdout);
char s[5]; scanf("%s",s);
return s[0]=='T';
}
int get(int L,int R){
while(L<R){
int m=(L+R)>>1;
if(Query(m,m+1)) R=m;
else L=m+1;
}
return L;
}
int n,m,ans1,ans2;
int main(){
scanf("%d%d",&n,&m);
ans1=get(1,n);
if(ans1==1) ans2=get(2,n); else
if(ans1==n) ans2=get(1,n-1); else{
ans2=get(1,ans1-1);
if(!Query(ans2,ans1)) ans2=get(ans1+1,n);
}
printf("2 %d %d\n",ans1,ans2);
return 0;
}