ZOJ Problem Set - 3694

来源:互联网 发布:华为的狼性管理知乎 编辑:程序博客网 时间:2024/06/05 11:53
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<deque>#include<queue>using namespace std;typedef long long ll;template<typename T>T ABS(T n){return n>0?n:-n;}const int maxn = 111111;const ll INF = (1ll<<62);int a[maxn];ll sum[maxn],s[maxn];ll dp[11][maxn];ll t[maxn];int n,M,L,R;void output(ll a[]){for(int i=1;i<=n;++i){printf("%lld ",a[i]);}puts("");}ll DP(ll rate){int i,j,k;for(j=0;j<=M;++j)for(i=0;i<=n;++i)dp[j][i]=j?-INF:0;for(i=1;i<=n;++i) t[i]=sum[i]*100-rate*i;//output(t);int p;ll ans=-INF;//int lhs,rhs;for(j=1;j<=M;++j){deque<int>q;for(i=L;i<=n;++i){p=i-L;while(!q.empty()&&i-q.front()>R) q.pop_front();while(!q.empty()) {k=q.back();if(dp[j-1][k]-t[k]<dp[j-1][p]-t[p])q.pop_back();else break;}q.push_back(p);dp[j][i]=dp[j][i-1];if(!q.empty()){k=q.front();dp[j][i]=max(dp[j][i],dp[j-1][k]+t[i]-t[k]);//printf("dp[%d][%d]=%lld  %d %lld\n",j,i,dp[j][i],k,t[i]-t[k]);}}}for(i=1;i<=n;++i) ans=max(ans,dp[M][i]);//cout<<"==========="<<endl;//cout<<rate<<endl;//cout<<"a  "<<ans<<endl<<endl;return ans;}void solve(){int i;ll l=INF,r=-INF,m;ll ans=0,tmp;for(i=1;i<=n;++i){scanf("%d",a+i);}if(L*M>n){puts("-1");return;}//DP(0);for(i=1;i<=n;++i) {l=min(100ll*a[i],l);r=max(100ll*a[i],r);sum[i]=sum[i-1]+a[i];}//cout<<sum[n]<<endl; ll x,y;//ll delta=INF;while(l<=r){m=(l+r)>>1;tmp=DP(m);if(tmp>=0){ans=m;l=m+1;}else if(tmp<=0){//if(m<0) ans=m;r=m-1;}}x=ans/100,y=ans%100;printf("%lld.%02lld\n",x,y>=0?y:-y);}int main(){//freopen("test.out","w",stdout);while(~scanf("%d%d%d%d",&n,&M,&L,&R)){solve();}return 0;}/*6 2 2 33 1 3 1 1 34 1 2 24 1 2 37 2 2 38 9 5 6 7 1 34 1 1 14 5 8 94 1 1 1-1 -2 -10 -112 1 2 2-10 -118 2 2 51 4 7 -1 9 10 -2 514 3 2 6 8 9 10 10 10 10 108 9 5 50 51 52 537 2 2 68 9 10 10 10 10 107 2 2 68 9 10 10 10 10 1014 3 2 6 8 9 10 10 10 10 108 9 5 50 51 52 538 4 1 54 7 -8 89 4 7 8 5 10 2 3 51 7 89  2 311 54 65 74 8510 3 3 51 7 89  2 311 54 65 74 858 2 3 5-1 -7 8  -2  -5 -6 -74 -85*/