SYZOJ 最大平均数子数组
参考论文《周源--浅谈数形结合思想在信息学竞赛中的应用》
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<ctime> 7 #include<cctype> 8 using namespace std; 9 const int MAXN=100000+10; 10 inline int get_num(){ 11 int res=0,f=1;char ch=getchar(); 12 while(!isdigit(ch)){if(ch == '-') f=-1;ch=getchar();} 13 while(isdigit(ch)){ 14 res=(res<<1)+(res<<3)+(ch^0x30); 15 ch=getchar(); 16 } 17 return res*f; 18 } 19 int N,k; 20 int sum[MAXN]; 21 int que[MAXN]; 22 double getk(int l,int r){ 23 return (sum[r]-sum[l-1])*1.0/(r-l+1); 24 } 25 26 int main(){ 27 scanf("%d %d",&N,&k); 28 for(int i=1;i<=N;i++){ 29 sum[i]=sum[i-1]+get_num(); 30 } 31 double res=-1e15; 32 int hd=1,tl=0; 33 for(int i=k;i<=N;i++){ 34 while(hd <= tl && que[hd] > i-k) hd++; 35 while(hd <= tl && getk(que[tl],i) < getk(i-k+1,i)) tl--; 36 que[++tl]=i-k+1; 37 res=max(res,getk(que[hd],i)); 38 } 39 printf("%d\n",(int)(res*1000)); 40 return(0); 41 }