题目地址
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll anss=1e18,n,m,k,flag,x[300001],h[300001];
void ans2(){
ll an = 0,o = m/k+1,p = m%k,q = 0,l = h[n];
while(h[n] > 0){
h[n] -= o;
an++;
if(!q&&an >= p){
q = 1;
o--;
}
}
cout << l - an;
}
bool judge(int s){
map<ll,ll> y;
ll start = 1,end = 1,le = 0,anp = 0,an = 0,op = 0;
for(int i = 1; i <= n; i++){
if(x[i] > s) return 0;
while(an + x[i] > s){
an -= y[start];
start++;
end++;
}
end++;
y[end] = x[i];
an += x[i];
if(start > end) return 0;
if(end - start > k){
an -= y[start];
start++;
}
if(end > m){
return 0;
}
anp = max(anp,an);
}
if(end > m) return 0;
anss = min(anss,anp);
return 1;
}
void ans3(){
ll mid,l = 0,r = h[n];
while(l <= r){
mid = (r+l)/2;
if(!judge(mid)) l = mid+1;
else r = mid-1;
}
cout << h[n] - l;
}
void ans(int id){
ll an = 0;
for(int i = 1; i <= n; i++) h[i] = h[i-1] + x[i];
if(id == 2){
ans2();
return ;
}
if(id == 3){
ans3();
return ;
}
for(int i = 0; i <= n-k; i++) an = max(an,h[k+i] - h[i]);
cout << h[n] - an;
return ;
}
int main(){
freopen("nut.in","r",stdin);
freopen("nut.out","w",stdout);
cin >> n >> m >> k;
for(int i = 1; i <= n; i++){
cin >> x[i];
if(x[i] == 1) flag++;
}
if(n == m){
ans(1);
return 0;
}
if(flag == n){
ans(2);
return 0;
}
ans(3);
return 0;
}