# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1211062 | moondarkside | Rice Hub (IOI11_ricehub) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
long long findRiceFromSpot(long long pos,vector<long long>& CarryValuesR,vector<long long>& CarryValuesL,long long X[],long long money){
long long Md=min(pos,(long long)CarryValuesR.size()-pos-1);
long long r=(long long)CarryValuesR.size();
long long mD=0;
long long best=1;
while(Md>mD){
long long mid=(Md+mD-1)/2+1;
long long price=CarryValuesR[pos]-CarryValuesR[pos-mid]-(X[pos]-X[pos-mid])*(pos-mid);
price+=CarryValuesL[r-1-pos]-CarryValuesL[r-1-pos-mid]-(X[pos+mid]-X[pos])*(r-1-pos-mid);
if(price>money){
Md=mid-1;
}
else{
mD=mid;
}
}
best=best+mD*2;
if(pos-mD>0){
long long price=CarryValuesR[pos]-CarryValuesR[pos-mD-1]-(X[pos]-X[pos-mD-1])*(pos-mD-1);
price+=CarryValuesL[r-1-pos]-CarryValuesL[r-1-pos-mD]-(X[pos+mD]-X[pos])*(r-1-pos-mD);
if(price<=money){
best=best+1;
}
}
return best;
}
long long besthub(long long R,long long L,long long X[],long long B){
std::vector<long long> CarryValuesR;
std::vector<long long> CarryValuesL;
CarryValuesR.push_back(0);
CarryValuesL.push_back(0);
for(long long i=1;i<R;i++){
long long price=CarryValuesR[i-1]+(X[i]-X[i-1])*(i);
CarryValuesR.push_back(price);
}
for(long long i=1;i<R;i++){
long long price=CarryValuesL[i-1]+(X[R-i]-X[R-i-1])*(i);
CarryValuesL.push_back(price);
}
long long Maximum=0;
for(long long i=0;i<R;i++){
Maximum=max(Maximum,findRiceFromSpot(i,CarryValuesR,CarryValuesL,X,B));
}
return Maximum;
}