题目大意
有n个数,我们可以输入?l r,将得到l到r次大值的下标,我们可以问40次,找出数组中的最大数的下标
题解
我们可以先询问1到n的次大值下标a,如果a在1到n/2之间,然后询问1到n/2的次大值下标b,且a等于b,显然最大值在1到n/2之间,如果a不等于b,显然最大值在n/2到n之间,如果a在n/2到n之间,也是类似的推导过程,所以我们可以每次将区间用此方法二分,n的值是1e5,我们每次二分区间需要2次询问,所以需要2log(1e5)=34次多询问
#include<cstdio>
int main(){
int n,l,r,mid,a,sec1,sec2,sec3;
scanf("%d",&n);
l=1;
r=n;
while(l<r){
mid=(l+r)/2;
printf("? %d %d\n",l,r);
fflush(stdout);
scanf("%d",&sec1);
if(r-l==1){
if(sec1==l){
l=r;
}
break;
}
if(sec1<=mid){
printf("? %d %d\n",l,mid);
fflush(stdout);
scanf("%d",&sec2);
if(sec2!=sec1){
l=mid+1;
}else{
r=mid;
}
}else{
if(mid+1==r){
mid--;
}
printf("? %d %d\n",mid+1,r);
fflush(stdout);
scanf("%d",&sec3);
if(sec3!=sec1){
r=mid;
}else{
l=mid+1;
}
}
}
printf("! %d\n",l);
}