1 条题解

  • 0
    @ 2025-8-24 22:37:58

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar MoSalah
    退役不退学

    搬运于2025-08-24 22:37:58,当前版本为作者最后更新于2022-05-02 22:53:36,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意

    这是一道交互题

    首先,在这里感谢出题人让我知道了怎么写交互题。

    55005500 次询问内,你要求出最初的 aa 数组。

    询问方式有三种:

    • ? 1 i\texttt{? 1 i} 询问 d1id_{1 \sim i} 中有几个不同的值,交互库会返回一个正整数 xx 表示答案。

    • ? 2 i\texttt{? 2 i} 使 ai=0a_i=0

    • ! a1 a2 a3 ... an\texttt{! a1 a2 a3 ... an} 输出答案。

    返回的数值 xx 就是 di=maxj=1i{aj}d_i = \max \limits_{j=1}^{i} \left \{a_j \right \}

    题解

    模拟?3030 分。

    aa 数组中每一位往前的最大值就可能是:

    a1,a2,a3,...,ai1,n,n,n,n,n,n,n...a_1,a_2,a_3,...,a_{i-1},n,n,n,n,n,n,n...

    画图发现,如果第 ii 位的值为当前数组中最大值,那么询问这个点往后的询问值一定与第 ii 位的询问值相符。那么最后一位的询问值一定与第 ii 位的询问值一样。现在就是要找到这个 ii 位,记录下来。

    考虑二分。

    在这个数组中二分查询这个 ii 位,首先询问一次 nn 位,如果第 jj 位和第 nn 位相同,那么查找 jj 往前的位置,不然查找 jj 往后的位置,最终查找到开头的位置,那么这位置一定是 nn。标记后将 aia_i 清零,那么这个序列中的最大值就是 n1n-1,重复操作,直到确定 11 的位置。

    过程在图片里面。

    清零之后求 n1,n2,n3,...,1n-1 , n-2 , n-3 , ... , 1 以此类推。好了,这道题就解决了。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int ans[50005];
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            int n;
            scanf("%d",&n);
            for(int i=n;i>=1;i--){
                printf("? 1 %d\n\n",n);
                fflush(stdout);//刷新缓存
                int biao;
                scanf("%d",&biao);
                int l=1,r=n;
                while(l<r){
                    int mid=(l+r)>>1;
                    int tmp;
                    printf("? 1 %d\n\n",mid);
                    fflush(stdout);//刷新缓存
                    scanf("%d",&tmp);
                    if(tmp==biao) r=mid;
                    else l=mid+1;
                }
                printf("? 2 %d\n\n",r);
                fflush(stdout);//刷新缓存
                ans[r]=i;
            }
            printf("!");
            for(int i=1;i<=n;i++) printf(" %d",ans[i]);
            puts("\n");
            fflush(stdout);//刷新缓存
        }
        return 0;
    }
    
    • 1

    信息

    ID
    7279
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者