構造一個序列
。每次二分一個答案
,構造
序列方法:
然後維護
的前綴和,並記錄前綴和的最小值。通過查詢是否存在一個長度大於
、區間和大於
的區間。這樣做時間複雜度是
的,沒有問題。
#include<cstdio> #include<algorithm> using namespace std; const int N=1e5+10; int n,len,a[N],b[N]; bool judge(int mid) { int minn=0x3f3f3f3f; 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++) { if(i>=len)minn=min(minn,b[i-len]); b[i]+=b[i-1]; if(i>=len&&b[i]-minn>0)return true; } return false; } int main() { //freopen("in.txt","r",stdin); scanf("%d%d",&n,&len); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int l=0,r=1e9; while(l<r) { int mid=(l+r+1)>>1; if(judge(mid))l=mid; else r=mid-1; } printf("%d\n",r); return 0; }
這種題沒有秒解是很不應該的。首先對於一個區間,不需要把它排序,只需進行比較就好了;再者我們發現,如果答案太大是找不到這樣的區間的,也就是說答案是具有單調性的,應該想到二分答案轉化爲判定。吸取教訓。