您的位置:首页 > 其它

Vijos 1617 超级教主(单调队列DP)

2013-05-30 09:23 197 查看
好久没写了,单调队列。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int dp[2000001],p[2000001],sum[2000001];
int que[2000001];
int main()
{
int n,m,i,str,end;
scanf("%d%d",&n,&m);
for(i = 1;i <= n;i ++)
{
scanf("%d",&p[i]);
sum[i] = sum[i-1] + p[i];
}
dp[0] = m;
str = end = 0;
for(i = 1;i <= n;i ++)
{
while(str < end&&dp[i-1] - sum[i-1] > dp[que[end-1]]-sum[que[end-1]])
end --;
que[end++] = i-1;
dp[i] = dp[que[str]]-i*100 + sum[i]-sum[que[str]];
while(str < end&&dp[que[str]]-(i+1)*100 < 0)
str ++;
}
printf("%d\n",dp
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: