zoukankan      html  css  js  c++  java
  • BZOJ4385 : [POI2015]Wilcze doły

    求出前缀和$s$,设$f[i]=s[i+d-1]-s[i-1]$。

    从左到右枚举的右端点$i$,左端点$j$满足单调性,若$s[i]-s[j-1]-max(区间内最大的f)leq p$,则可行。

    用单调队列维护即可,时间复杂度$O(n)$。

    #include<cstdio>
    #define N 2000010
    int n,d,i,j,q[N],h,t,ans;long long p,sum,s[N],f[N];
    inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
    int main(){
      read(n),scanf("%lld",&p),read(d);
      for(i=1;i<=n;i++)read(j),s[i]=s[i-1]+j;
      for(i=1;i<=n-d+1;i++)f[i]=s[i+d-1]-s[i-1];
      for(i=d,j=h=1;i<=n;i++){
        while(h<=t&&f[q[t]]<=f[i-d+1])t--;q[++t]=i-d+1;
        while(s[i]-s[j-1]-f[q[h]]>p)for(j++;q[h]<j;h++);
        if(i-j+1>ans)ans=i-j+1;
      }
      return printf("%d",ans),0;
    }
    

      

  • 相关阅读:
    Spring MVC
    Spring
    MyBatis
    Java Listener
    Java Filter
    JSTL
    EL
    pyltp安装
    美团面经-java开发
    oppo面经-java开发
  • 原文地址:https://www.cnblogs.com/clrs97/p/5271149.html
Copyright © 2011-2022 走看看