題目鏈接
題目大意
給你一個長度為\(n(1\leq n \leq2e5)\)的數組
要你求至少長度為\(k(1<=k<=n)\)的連續數組的中位數的最大值
題目思路
感覺是沒一點思路
首先假設數組只有1和-1的元素
那么怎么判斷這個答案為1還是-1
可以利用前綴和與前綴和的前綴的最小值
來計算答案是1還是-1
然后觀察發現最終的答案可以二分
check的時候大於等於這個值當作1,否則當作-1
代碼
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+5,inf=0x3f3f3f3f;
const int eps=1e-3;
const ll mod=1004535809;
int n,k;
int a[maxn];
int pre[maxn],premi[maxn];
bool check(int x){
for(int i=1;i<=n;i++){
pre[i]=pre[i-1]+(a[i]>=x?1:-1);
premi[i]=min(premi[i-1],pre[i]);
}
for(int i=k;i<=n;i++){
if(pre[i]-premi[i-k]>0){
return 1;
}
}
return 0;
}
signed main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int l=1,r=n,ans;
while(l<=r){
int mid=(l+r)/2;
if(check(mid)){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
printf("%d\n",ans);
return 0;
}