이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "ricehub.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//return number of rice fields
vector<ll> s;
vector<ll> coord;
ll totalcostrtol(int hub, int e){//e hub
assert(e>=hub);
return s[e]-s[hub]-((e-hub)*coord[hub]);
}
ll totalcostltor(int hub, int e){//hub e
assert(e<=hub);
return coord[hub]*(hub-e+1)-(s[hub]-(e==0?0:s[e-1]));
}
int n;
ll success(int ind, ll range, ll b){
//returns max truckloads of rice, or -1 if not possible
//using all rice up to and including coord (plus a bit more if necessary)
//cout<<"check "<<ind<<" "<<range<<": ";
ll total = 0;
ll ricehubs = 0;
int left = lower_bound(coord.begin(), coord.end(), coord[ind]-range)-coord.begin();
//cout<<left<<" ";
total+=totalcostltor(ind,left);
int right = upper_bound(coord.begin(), coord.end(), coord[ind]+range)-coord.begin()-1;
//cout<<right<<'\n';
total+=totalcostrtol(ind,right);
//cout<<total<<'\n';
if (total>b){
//cout<<"fail"<<'\n';
return -1;
}
ricehubs+=right-left+1;
if (left-1>=0){
int left2 = lower_bound(coord.begin(), coord.end(), coord[left-1])-coord.begin();
ll numadd = (min(b-total,ll((left-left2)*(coord[ind]-coord[left-1])))/(coord[ind]-coord[left-1]));
ricehubs+=numadd;
total+=numadd*(coord[ind]-coord[left-1]);
}
if (right+1<n){
int right2 = upper_bound(coord.begin(), coord.end(), coord[right+1])-coord.begin()-1;
ricehubs+=(min(b-total,ll((right2-right)*(coord[right+1]-coord[ind])))/(coord[right+1]-coord[ind]));
}
return ricehubs;
}
int besthub(int R, int L, int X[], long long B){
ll maxfields = 0;
//coords from 1 to L
n = R;
coord = vector<ll>(X,X+n);
s.resize(n);
s[0]=coord[0];
for (int i = 1; i<n; i++){
s[i]=s[i-1]+coord[i];
}
for (int i = 0; i<n; i++){
//cout<<"consider "<<i<<'\n';
//consider rice field i
ll numfields = 1;
//go left
ll l=0,r=max(coord[n-1]-coord[i],coord[i]-1)+10;
while (l<=r){
ll mid = (l+r)/2;
if (success(i, mid, B)!=-1){
l=mid+1;
} else {
r=mid-1;
}
}
//l is leftmost hub possible
ll sc = success(i,l-1,B);
//cout<<sc<<'\n';
maxfields=max(maxfields,sc);
}
return maxfields;
}
컴파일 시 표준 에러 (stderr) 메시지
ricehub.cpp: In function 'int besthub(int, int, int*, long long int)':
ricehub.cpp:65:6: warning: unused variable 'numfields' [-Wunused-variable]
ll numfields = 1;
^~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |