Codeforces Round #703 (Div. 2) C2 - Guessing the Greatest (hard version)(二分+思维)

 

 

有 n 个数构成一种排列,每次询问一个区间,可以给出区间中第二大数的位置,在 20 次询问中找到区间最大数的位置 

 又是一道交互题,一眼二分

一开始想的是对于区间 [l,r] 询问其第二大数的位置 pos,然后再查询区间 [l,pos] 中的第二大数的位置,如果两者相同,那么一定在 [l,pos] ,否则在[pos+1,r] 中,但是策略被卡,询问次数过多

值得注意的是题目一开始就可以得到 [1,n] 中的第二大数的位置,利用这个位置与 mid 就可以完成 logN 的复杂度

但是中间需要注意区间 [1,n] 中第二大数的位置 pos 是固定的,二分过程不保证区间仍然包含 pos 这个位置,而 pos 是必须应用的一个参照数

    int n;

int get(int l,int r)
{
	int x;
	printf("? %d %d\n\n",l,r);
	fflush(stdout);
	sd(x);
	return x;
}

int main()
{
    //IOS;
    sd(n);
    int l=1,r=n,ans;
    int res=get(l,r),pos;
    while(l<r){
    	int mid=l+r>>1;
    	if(r-l==1){
    		pos=get(l,r);
    		if(pos==l) l=r;
    		break;
    	}
    	if(mid>res){
    		pos=get(min(l,res),mid);
    		if(pos==res) r=mid;
    		else l=mid+1;
    	} else{
    		pos=get(mid,max(r,res));
    		if(pos==res) l=mid;
    		else r=mid-1; 
    	}
    }
    printf("! %d\n",l);
    return 0;
}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页