15分求调
查看原帖
15分求调
1016999
feng_dou_hao楼主2024/1/16 14:50
#include<bits/stdc++.h>
using namespace std;
#define f(i,a,b) for(int i=a;i<=b;i++)
int am[500005][35];
int an[500005][35];
int N,k,n;
int cham(int s,int g){
    int l=log2(g);
    return max(am[s][l],am[s+g-(1<<l)][l]);
}
int chan(int s,int g){
    int l=log2(g);
    return min(an[s][l],an[s+g-(1<<l)][l]);
}
int check(int ml){
    int tot=0;
    f(i,1,n-ml+1){
        if(N<=cham(i,ml)-chan(i,ml)){
            tot++;
        }
        if(tot==k)return 1;
    }
    return 0;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&k);
        f(i,1,n){
            scanf("%d",&am[i][0]);
            an[i][0]=am[i][0];
        }
        f(e,1,(int)log2(n)){
            f(i,1,n){
                if(i+(1<<e)-1>n)break;
                am[i][e]=max(am[i][e-1],am[i+(1<<e-1)][e-1]);
                an[i][e]=min(an[i][e-1],an[i+(1<<e-1)][e-1]);
            }
        }
        int ml=n-k+1;
        N=0x3f3f3f3f;
        f(i,1,k){
            N=min(N,cham(i,ml)-chan(i,ml));
        }
        int zl=1,yl=ml;
        while(zl<yl){
           int mid=(zl+yl)>>1;
           if(check(mid)){
              yl=mid;
           }
           else {
              zl=mid+1;
           }
        }
        printf("%d %d\n",N,yl);
    }
    return 0;
}
2024/1/16 14:50
加载中...