二分[l,r]的范围,询问[l,mid]的区间内有多少大小在这个区间内的数,
是偶数则代表全为区间内部交换,没有答案,就选[mid+1,r]的区间,
是奇数就代表存在未交换数,选[l,mid]的区间。
tips:交互题格式很简单,建议自己学一下。
#include<bits/stdc++.h>
#define PII pair<int,int>
#define PLL pair<long long,long long>
#define fi first
#define se second
#define endl '\n'
#define bug printf("bug\n");
using namespace std;
const int N=2e5+10;
const int INF=0x3f3f3f3f;
const long long LNF=0x3f3f3f3f3f3f3f3f;
int n;
bool check(int l,int r){
cout<<"? "<<l<<' '<<r<<endl;
int cnt=0;
for(int i=l;i<=r;i++){
int x; cin>>x;
if(x>=l&&x<=r) cnt++;
}
if(cnt%2==0) return false;
return true;
}
void solve(){
cin>>n;
int l=1,r=n;
while(l<r){
int mid=(l+r)>>1;
if(check(l,mid)) r=mid;
else l=mid+1;
}
cout<<"! "<<l<<endl;
}
int main(){
int t; //t=1;
scanf("%d",&t);
while(t--){
solve();
}
return 0 - 0;
}
Codeforces Round #803 (Div. 2) D题题解
最新推荐文章于 2024-06-03 10:27:37 发布