Codeforces Round #755 (Div. 2, based on Technocup 2022 Elimination Round 2)(CF1589)题解
CF1589D. Guess the Permutation
题意
交互题,对给定的n,有数列1..n进行f(i,j,k)的操作,即把[i,j-1]逆序,把[j,k]逆序。
可以使用不超过40次提问,询问[l,r]中的逆序对数。
要求输出i,j,k。
解析
先计算i,因为ni(1,i)=0 & ni(1,i+1)!=0, 所以可以通过二分求出i。
已知左端点,考虑第一个点对逆序对数的贡献就是len-1,所以ni(i,n)-ni(i+1,n)+1就是逆序的长度。
同理可以算出k的值。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int t,n;
int ask(int x,int y) {
if(x==y) return 0;
cout<<"? "<<x<<" "<<y<<'\n';
int ans=0; cin>>ans;
return ans;
}
signed main() {
cin>>t;
while(t--) {
cin>>n;
int l=1,r=n,ans=0;
while(l<=r) {
int mid=(l+r)>>1;
if(ask(1,mid)==0) ans=mid,l=mid+1;
else r=mid-1;
}
int i=ans,j=i+ask(ans,n)-ask(ans+1,n)+1;
int k=j+ask(j,n)-ask(j+1,n);
cout<<"! "<<i<<" "<<j<<" "<<k<<'\n';
}
return 0;
}
人间没有永恒的夜晚,世界没有永恒的冬天