正在加载今日诗词....

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;
}
posted @ 2021-12-08 19:12  wky32768  阅读(35)  评论(0编辑  收藏  举报