제출 #245240

#제출 시각아이디문제언어결과실행 시간메모리
245240kimbj0709쌀 창고 (IOI11_ricehub)C++14
100 / 100
25 ms1024 KiB
#include<bits/stdc++.h>
using namespace std;
#include "ricehub.h"
int besthub(int R, int L, int X[], long long B){
  long long ans = 1;
  long long currsum = 0;
  long long left = 0,right = -1;
  for(long long i=0;i<R;i++){
    currsum += (X[i]-X[i-1])*(i-left);
    currsum -= (X[i]-X[i-1])*(right-i+1);
    right = max(right,i);
    while(currsum>B){
      if(abs(X[i]-X[left])>abs(X[i]-X[right])){
        currsum -= abs(X[i]-X[left]);
        left++;
      }
      else{
        currsum -= abs(X[i]-X[right]);
        right--;
      }
    }
    while(right!=R-1){
      if(abs(X[i]-X[left])>abs(X[i]-X[right+1])){
        currsum -= abs(X[i]-X[left]);
        currsum += abs(X[i]-X[right+1]);
        left++;
        right++;
      }
      else{
        break;
      }
    }
    while(currsum<=B){
        long long l,r;
        if(left==0){
            l = INT_MAX;
        }
        else{
            l = abs(X[i]-X[left-1]);
        }
        if(right==R-1){
            r = INT_MAX;
        }
        else{
            r = abs(X[i]-X[right+1]);
        }
        long long mini = min(l,r);
        if(currsum+mini>B||(l==INT_MAX&&r==INT_MAX)){
            break;
        }
        if(l<r){
            left--;
        }
        else{
            right++;
        }
        currsum += mini;
    }
    ans = max(ans,right-left+1);
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...