题目大意
和C1一样,只不过询问次数从40次降到了20次
题解
我们第一步可以模仿C1的方法,得到最大值所在的区间,假如次大值在i,询问1到i的次大值是否在i,如果在i再询问i/2到i的次大值是否为i,如果是,证明最大值就在i/2到i位置上,继续如此不断二分,就能得到答案,大约在18次左右就那找到答案
#include<cstdio>
int main(){
int n,ans,nowq,l,r;
scanf("%d",&n);
printf("? %d %d\n",1,n);
fflush(stdout);
scanf("%d",&ans);
if(n==2){
printf("! %d",2-ans+1);
return 0;
}
l=2,r=n;
if(ans!=1){
printf("? %d %d\n",1,ans);
fflush(stdout);
scanf("%d",&nowq);
if(nowq==ans){
l=1,r=ans;
}else{
l=ans,r=n;
}
}
if(l<ans){
while(l<r-1){
int mid=(l+r)/2;
printf("? %d %d\n",mid,ans);
fflush(stdout);
scanf("%d",&nowq);
if(nowq==ans){
l=mid;
}else{
r=mid;
}
}
}else{
while(l<r-1){
int mid=(l+r)/2;
printf("? %d %d\n",ans,mid);
fflush(stdout);
scanf("%d",&nowq);
if(nowq==ans){
r=mid;
}else{
l=mid;
}
}
}
printf("! %d\n",l<ans?l:r);
}