Submission #211648

#TimeUsernameProblemLanguageResultExecution timeMemory
211648mohamedsobhi777Rice Hub (IOI11_ricehub)C++14
100 / 100
320 ms3572 KiB
#include <bits/stdc++.h> 
#include "ricehub.h"

using namespace std ;

const int N = 1e5 + 7 ; 

int n ; 
vector<long long> coordinates , prefix; 
long long limit ; 


long long calc(int l , int r){
    if(l>r)return 0ll; 
    return prefix[r] - (l?prefix[l-1]: 0) ;
}

long long sum_abs(int st , int en, long long x){
    int delimeter = upper_bound(coordinates.begin() + st , coordinates.begin() + en +1 , x)  - coordinates.begin() ;
    delimeter-- ; 
    long long ret = 1ll * x * (delimeter - st + 1)  - calc(st , delimeter)+ calc(delimeter+1 , en) - 1ll* (en-delimeter) * x ; 
    return ret ; 
}

bool check(int l , int r){
    int lo = -1 , hi =1e9 ; 
    long long ret = 1e17 ; 
    while(hi - lo > 1){
        int mid = (lo+hi) /2 ; 
        long long get1 = sum_abs(l , r ,mid) ; 
        long long get2 = sum_abs(l , r , mid+1) ; 
        if(get1 >  get2){
            lo = mid ; 
        }
        else {
            hi = mid ; 
        }
    }
    ret = sum_abs(l , r , lo+1) ;
    return ret <= limit ; 
}

int besthub(int R, int L, int X[], long long B)
{
    n = R ; 
    limit = B ; 
    int ans = 1 ; 
    for(int i= 0 ; i<R ; i++){
        if(prefix.size()){
            prefix.push_back(X[i] + prefix.back() ); 
        }
        else {
            prefix.push_back(X[i]);
        }
        coordinates.push_back(X[i]) ; 
    }
    int l = 0 , r = -1 ; 
    while(r< R-1 ){
        r++ ; 
        while( !check(l , r)  )l++ ; 
        ans = max(ans , r-l + 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...