[COCI2010-2011#5] DVONIZ
A_Sunny_Day · · 题解
[COCI2010-2011#5] DVONIZ
题意:
定义长度为
首先我们定义
递推式为:
那么问题变成了求对于每个位置作为
在取完之后,我们根据左右指针所在的位置
而更新答案我们这样更新:
在结束后我们再遍历一遍,通过上文得到的递推式推出所有的
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e5+5;
int n;
ll s,a[MAXN],len[MAXN];
int main()
{
scanf("%d %lld",&n,&s);
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]);
int l=1,r=0;
ll ls=0,rs=0;
while(rs+a[r+1]<s&&r<n) rs+=a[++r];
for(int i=1;i<=n;++i)
{
ls+=a[i];
rs-=a[i];
while(ls>s&&l<=i)
{
ls-=a[l];
++l;
}
while(rs+a[r+1]<=s&&r<n) rs+=a[++r];
int le=min(i-l+1,r-i);
if(le>0) len[i-le+1]=le*2;
}
for(int i=1;i<n;++i) len[i]=max(len[i-1]-2,len[i]);
for(int i=1;i<n;++i)
printf("%lld\n",len[i]);
printf("0\n");
return 0;
}