#include <bits/stdc++.h>
using namespace std;
int32_t main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,k;
long long t;
cin >> n >> k >> t;
long long arr[n];
for(int i=0; i<n; i++) cin >> arr[i];
k--;
long long lo=0,hi=1e9+5,mid;
while(lo<hi){
mid=(lo+hi)/2;
vector<long long> lft,rgt;
for(int i=0; i<k; i++) lft.push_back(2ll*(arr[i+1]-arr[i]));
for(int i=n-1; i>k; i--) rgt.push_back(2ll*(arr[i]-arr[i-1]));
vector<pair<long long,long long> > yr,yl;
for(int i=0; i<(int)lft.size(); i++){
pair<long long,long long> x={lft[i]/2ll,lft[i]/2ll-t*mid};
while(x.second>0&&!yl.empty()&&yl.back().second<=0){
x.first=max(x.first,x.second+yl.back().first);
x.second+=yl.back().second;
yl.pop_back();
}
yl.push_back(x);
}
for(int i=0; i<(int)rgt.size(); i++){
pair<long long,long long> x={rgt[i]/2ll,rgt[i]/2ll-t*mid};
while(x.second>0&&!yr.empty()&&yr.back().second<=0){
x.first=max(x.first,x.second+yr.back().first);
x.second+=yr.back().second;
yr.pop_back();
}
yr.push_back(x);
}
long long buff=t*mid;
bool can=true;
while((!yl.empty()&&yl.back().second<=0)||(!yr.empty()&&yr.back().second<=0)){
if(!yl.empty()&&yl.back().second<=0&&buff>=yl.back().first){
buff-=yl.back().second;
yl.pop_back();
}
else if(!yr.empty()&&yr.back().second<=0&&buff>=yr.back().first){
buff-=yr.back().second;
yr.pop_back();
}
else{
can=false;
break;
}
}
for(int i=yl.size()-2; i>=0; i--){
yl[i].first+=yl[i+1].second;
yl[i].second+=yl[i+1].second;
}
for(int i=yr.size()-2; i>=0; i--){
yr[i].first+=yr[i+1].second;
yr[i].second+=yr[i+1].second;
}
int degl[n],degr[n],tol[n],tor[n];
memset(degl,0,sizeof(degl));
memset(degr,0,sizeof(degr));
for(int i=0; i<yl.size(); i++){
long long rm=buff-yl[i].first;
if(rm<0) can=false;
int loo=0,hii=yr.size()-1,midd;
while(loo<hii){
midd=(loo+hii+1)/2;
if(yr[midd].second>rm) loo=midd;
else hii=midd-1;
}
if(yr[loo].second<=rm) tol[i]=-1;
else{
tol[i]=loo;
degr[loo]++;
}
}
for(int i=0; i<yr.size(); i++){
long long rm=buff-yr[i].first;
if(rm<0) can=false;
int loo=0,hii=yl.size()-1,midd;
while(loo<hii){
midd=(loo+hii+1)/2;
if(yl[midd].second>rm) loo=midd;
else hii=midd-1;
}
if(yl[loo].second<=rm) tor[i]=-1;
else{
tor[i]=loo;
degl[loo]++;
}
}
while(!yl.empty()||!yr.empty()){
if(!yr.empty()&°r[(int)yr.size()-1]==0){
int x=yr.size()-1;
if(tor[x]!=-1) degl[tor[x]]--;
yr.pop_back();
}
else if(!yl.empty()&°l[(int)yl.size()-1]==0){
int x=yl.size()-1;
if(tol[x]!=-1) degr[tol[x]]--;
yl.pop_back();
}
else{
can=false;
break;
}
}
if(can) hi=mid;
else lo=mid+1;
}
cout << (lo+1ll)/2ll;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |