[交互题][二分]Codeforces#415 (Div. 1) 809B. Glad to see you!

题意

戳这里

题解

第一次做交互题。
要求60次询问之内出结果。可以想到大概用的就是二分之类的方法。
考虑二分,每次怎么才能判断 [L,mid] [mid+1,R] 哪一部分一定有点呢?
比较巧妙的办法,询问 (mid,mid+1) ,就能判断离中间最近的是在哪边,往那一边走一定能找到。
题目要求的是找到两个点,我们先 get(1,n) 找到第一个点 ans1 ,然后 get(1,ans11) ,如果找不到就 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值