제출 #16449

#제출 시각아이디문제언어결과실행 시간메모리
16449chan492811쌀 창고 (IOI11_ricehub)C++98
100 / 100
29 ms5772 KiB
#include "ricehub.h"
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
long long n,m,left,right;
long long b,l,max1,now;
long long arr[100010];
int besthub(int R, int L, int X[], long long B)
{
    long long i;
    n=R; b=B;
    for(i=0;i<n;i++) arr[i]=(long long)X[i];
    while(right<n && now<=b){
        if(arr[right]-arr[0]<=b-now){
            now+=arr[right++]-arr[0];
        }else break;
    }max1=max(max1,right-left);
    for(i=1;i<n;i++){
        now+=(i-left)*(arr[i]-arr[i-1]); now-=(right-i)*(arr[i]-arr[i-1]);
        while(now>b){
            if(arr[i]-arr[left]<=arr[right-1]-arr[i]) now-=arr[--right]-arr[i];
            else now-=arr[i]-arr[left++];
        }
        while(right<n && arr[i]-arr[left]>=arr[right]-arr[i]){
            now-=arr[i]-arr[left]; left++;
        }
        while(now<=b){
            if(right<n && left>0){
                if(arr[i]-arr[left-1]>=arr[right]-arr[i]){
                    if(arr[right]-arr[i]<=b-now) now+=arr[right++]-arr[i];
                    else break;
                }else{
                    if(arr[i]-arr[left-1]<=b-now) now+=arr[i]-arr[--left];
                    else break;
                }
            }else if(right==n && left>0){
                if(arr[i]-arr[left-1]<=b-now) now+=arr[i]-arr[--left];
                else break;
            }else if(right<n && left==0){
                if(arr[right]-arr[i]<=b-now) now+=arr[right++]-arr[i];
                else break;
            }else break;
        }max1=max(max1,right-left);
    }
    return (int)max1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...