Advertisement
SuitNdtie

C - Great wall Bsearch

May 7th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.90 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<queue>
  3. using namespace std;
  4. typedef long long int ll;
  5. int main()
  6. {
  7.     int n,w;
  8.     ll k;
  9.     scanf("%d %d %d",&n,&w,&k);
  10.     ll arr[n+1];
  11.     ll maxh = 1;
  12.     for(int i = 1 ; i <= n ; i ++){
  13.         scanf("%lld",&arr[i]);
  14.         if(maxh < arr[i])maxh = arr[i];
  15.     }
  16.     ll l = 0 , r = maxh;
  17.     ll ans = maxh;
  18.     while(l <= r){
  19.         ll m = (l+r)/2;
  20.         queue<pair<int,ll> > q;
  21.         ll sumnow = 0;
  22.         ll cnt = 0;
  23.     //  printf("Test m %lld\n",m);
  24.         for(int i = 1 ; i <= n && cnt <= k; i ++){
  25.             if(!q.empty()){
  26.                 if(q.front().first+w == i){
  27.                     sumnow -= q.front().second;
  28.                     q.pop();
  29.                 }
  30.             }
  31.             if(arr[i]-sumnow > m){ //need to destroy
  32.                 ll dest = (arr[i]-sumnow)-m;
  33.             //  printf("Destroy %d %lld \n",i,dest);
  34.                 sumnow += dest;
  35.                 cnt += dest;
  36.                 q.push({i,dest});
  37.             }
  38.         }
  39.         if(cnt <= k){
  40.             ans = m;
  41.             r = m - 1;
  42.         }
  43.         else{
  44.             l = m + 1;
  45.         }
  46.     }
  47.     printf("%lld",ans);
  48.     return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement