zoukankan      html  css  js  c++  java
  • 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;
    }
    
    人间没有永恒的夜晚,世界没有永恒的冬天
  • 相关阅读:
    46. 全排列
    90. 子集 II
    289. 生命游戏
    844. 比较含退格的字符串
    1266. 访问所有点的最小时间
    707. 设计链表
    DOM 关于dom的
    插件库
    浏览器判断
    FTP 客户端安装
  • 原文地址:https://www.cnblogs.com/wky32768/p/15663774.html
Copyright © 2011-2022 走看看