牛客網NOIP賽前集訓營-提高組(第一場) A.中位數 [中位數]
阿新 • • 發佈:2018-12-09
思路:二分check是否存在>=mid的中位數,若sum[j]-sum[i]>0 && j-i+1>=len 則一定存在大於等於k的mid
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; const ll MOD=1e9+7; const int Seed=1e7+7; template <class T> bool sf(T &ret){ //Faster Input char c; int sgn; T bit=0.1; if(c=getchar(),c==EOF) return 0; while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); if(c==' '||c=='\n'){ ret*=sgn; return 1; } while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10; ret*=sgn; return 1; } ll a[N]; ll b[N]; ll sum[N]; ll mn[N]; int n,k; bool check(ll mid){ for(int i=1;i<=n;i++){ if(a[i]<mid) b[i]=-1; else b[i]=1; } for(int i=1;i<=n;i++) sum[i]=sum[i-1]+b[i]; mn[1]=sum[1]; for(int i=2;i<=n;i++) mn[i]=min(mn[i-1],sum[i]); for(int i=1;i<=n;i++){ if(i+1-k<=0) continue; if(sum[i]-mn[i-k]>0){ // printf("sum[%d]=%d mn[%d]=%d\n",i,sum[i],i+1-k,sum[i+1-k]); return true; } } return false; } /* 5 2 2 3 4 2 5 */ int main(){ sf(n),sf(k); for(int i=1;i<=n;i++) sf(a[i]); ll l=1,r=1e9; ll ans; // cout << check(5) << endl; while(l<=r){ ll mid=l+r>>1; // cout << mid<<" "<<check(mid) << endl; if(check(mid)) ans=mid,l=mid+1; else r=mid-1; } printf("%lld\n",ans); return 0; }