#include<bits/stdc++.h>
using namespace std;
int q[1111111],h,t,i,j,n,k,a[1111111];
int main()
{
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
h=1;t=0;
t++;
q[t]=1;
for(i=1;i<=n;i++)
{
while(h<=t&&i-q[h]==k) h++;
while(h<=t&&a[i]>a[q[t]]) t--;
t++;
q[t]=i;
if(i>=k) printf("%d ",a[q[h]]);
}
}
#include<bits/stdc++.h>
using namespace std;
long long n,m,i,j,a[1111111],mid,l,r,ans,qzh[1111111],q[1111111];
bool ch(int s)
{
int h,t;
h=1;
t=0;
t++;
q[t]=1;
for(int i=1;i<=n;i++)
{
while(h<=t&&i-q[h]==s) h++;
if(qzh[i]-qzh[q[h]]>t) return true;
while(h<=t&&qzh[q[t]]<qzh[i]) t--;
t++;
q[t]=i;
}
return false;
}
int main()
{
// freopen("rebuild.in","r",stdin);
// freopen("rebuild.out","w",stdout);
while(~scanf("%lld%lld",&n,&m))
{
ans=0;
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
qzh[i]=qzh[i-1]+a[i];
}
if(m<=0) printf("0\n");
else
{
int l,r,mid;
l=1;
r=n;
while(l<r)
{
mid=(l+r)/2;
if(ch(mid))
{
r=mid;
}
else
{
l=mid+1;
}
}
if(l==r&&r==n)
{
if(ch(l))
{
printf("%d\n",l);
}
else
{
printf("-1\n");
}
}
else printf("%lld\n",l);
}
}
}
在一年前赢得了小镇的最佳草坪比赛后,约翰变得懒惰了,再也没有修剪过草坪。现在,新一轮的比赛又开始了,约翰希望能够再次夺冠。然而,约翰家的草坪非常脏乱,因此,约翰需要让他的奶牛来完成这项工作。约翰家有N头奶牛,排成一直线,编号为1到N。每只奶牛的能力是不同的,第i头奶牛的能力为Ei。靠在一起的奶牛很熟悉,所以如果安排相邻的K+1头奶牛一起工作,她们就会密谋罢工,所以不能选中连续的K+1头奶牛。因此,约翰需要你的帮助。如何挑选奶牛,才能使她们的能力之和最高呢?
#include<bits/stdc++.h>
using namespace std;
long long n,k,i,j,h,t,a[1111111],s[1111111],dp[1111111],ak[1111111],q[1111111];
void dddl(long long i)
{
ak[i]=dp[i-1]-s[i];
while(h<=t&&ak[q[t]]<ak[i]) t--;
t++;
q[t]=i;
while(h<=t&&q[h]<i-k) h++;
dp[i]=ak[q[h]]+s[i];
}
int main()
{
scanf("%lld%lld",&n,&k);
h=0;t=1;
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
s[i]=s[i-1]+a[i];
}
for(i=1;i<=n;i++)
{
dddl(i);
}
printf("%lld\n",dp[n]);
}