D. Max Median 题解(二分+思维)
题目链接
题目大意
给你一个长度为\(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;
}
不摆烂了,写题