SPOJ: Help BTW (two points)

BTW wants to buy a gift for her BF and plans to buy an integer array. Generally Integer arrays are costly and hence bought the cheapest one from the market. Her BF is very judgemental and assess the quality of the array by just looking at the smallest element in the array. Hence, she decided to improve the quality of the array. Increment operation on array elements are very costly and would take ONE FULL DAY to complete. Also, Increment operations can be done in parallel on at most M consecutive array elements. She only has K days left. Help BTW calculate the maximum possible “quality” of the array she can attain.

(BTW BTW is the name of the character :P )

Input

Very first line contains T – (number of test cases)

First line in each test case contains N – (size of the array BTW has bought from the market), M, K (days left)

Second line in each test case contains N integers (values of the initial array BTW bought from the market)

Output

Print the maximum possible “quality” she can attain.

 

Constraints

1<=T<=100

1<=N<=10^5

0<=M<=N

0<=K<=10^9

0<=Values of array<=10^9

 

Example

Sample test case 1

Input

3 2 1

2 2 3

Output

3

Sample test case 2

Input

3 2 1

2 3 2

Output

2

  

The meaning of the question: There are N items, arranged in a row, and each item has a value, given M, K, it means that there are K times, and each time the value of a continuous interval not exceeding the length of M is increased by 1 . Find the maximization of the minimum value is .

Idea: Start to look at 100 sets of data, and the binary complexity is (T*N*log(Min+K)). . . I thought I couldn't pass it, but I couldn't think of any other way, but after a two-point try, it passed. . .
           The operation of adding a value to an interval of length M is: the delta data record accumulates the prefix sum, if the value of val is added to the position i, then the value of val is subtracted from the position i+M, and then it can be divided into two parts.
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const int maxn=100010;
const int inf=2000000000;
ll sum[maxn],tsum[maxn],delta[maxn],N,M,K;
bool check(ll Mid){
    ll tmp=K;
    for(int i=1;i<=N;i++) tsum[i]=sum[i],delta[i]=0;
    for(int i=1;i<=N;i++){
        delta[i]+=delta[i-1];
        if(tsum[i]+delta[i]<Mid&&tmp){
            ll t=min(tmp,Mid-tsum[i]-delta[i]);
            delta[i]+=t;
            if(M+i<=N) delta[M+i]-=t;
            tmp-=t;
        }
        tsum[i]+=delta[i];
        if(tsum[i]<Mid) return false;
    }
    return true;
}
intmain ()
{
    int T,i,j;
    ll Min;
    scanf("%d",&T);
    while(T--){
        scanf("%lld%lld%lld",&N,&M,&K); Min=inf;
        for(i=1;i<=N;i++){
           scanf("%lld",&sum[i]);
           if(sum[i]<Min) Min=sum[i];
        }
        ll L=Min,R=Min+K,Mid,ans=Min;
        while(L<=R){    
            Mid=(L+R)>>1LL;    
            if(check(Mid)) ans=Mid,L=Mid+1;
            else R=Mid-1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
  

 

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325125596&siteId=291194637