1 条题解

  • 0
    @ 2024-11-19 20:23:51

    二分答案

    4×105 4 \times 10^5的范围n2n^2暴力肯定不行

    不难发现,在寻找 jj时,本质上是寻找最后一个比 aia_i小的 aja_j(k+1in)(k+1 \le i \le n)

    那么先求一遍 a1a_1aka_k后缀最小值,我们发现,现在的后缀最小值满足单调性,那么就可以二分最小的操作次数

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int a[400005];
    int b[400005];
    int c[400005];
     int n,k;
    bool check(int x)//验证函数
    { 
      
      for(int i=n;i>k;i--)
      {
        if(i-x>k)continue;
        int sum=max(1ll,i-x);
        if(a[i]>c[sum])
        return 1;
      }
      return 0;
    }
    signed main()
    {
      
       cin >> n >>k;
       for(int i=1;i<=n;i++)
       {
        cin >> a[i];
       }
       int mi=1e9;
       for(int i=k;i>=1;i--)\\维护后缀最小值
       {
          mi=min(a[i],mi);
          c[i]=mi;
       }
       int l=1,r=n;
       int mid;
       while(l<=r)//二分答案
       {
        int mid=(l+r)>>1;
        if(check(mid))
        r=mid-1;
        else
        l=mid+1;
       }
       if(l<=n)//有解
       cout <<l<<"\n";
       else
       cout <<"-1\n";
    }
    
    • 1

    信息

    ID
    1063
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    45
    已通过
    4
    上传者