您的位置:首页 > 其它

hdu 4193 Non-negative Partial Sums 单调队列

2014-04-16 16:56 435 查看
先复制一遍数组,在用一个数组sum[ i ]表示前 i 个数字的和,对于以第k个数开头的情况,只需找出sum[ k ]到sum[ k+n ]的最小值min,如果min - sum[ k-1 ]大于0则满足。

#include <stdio.h>
#define maxn 2001000
int a[maxn],sum[maxn];
int q[2*maxn];
int n;
int front,rear;
void in(int i)
{
while(front<=rear&&sum[q[rear]]>=sum[i]) rear--;
q[++rear]=i;
}
int out(int i)
{
if(q[front]==i-n) front++;
return q[front];
}
int main()
{
int i;
while(1)
{
int ans=0;
scanf("%d",&n);
if(n==0) break;
a[0]=0;
sum[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(i=n+1;i<=2*n;i++)
{
a[i]=a[i-n];
sum[i]=sum[i-1]+a[i];
}
front=0;rear=-1;
for(i=1;i<n;i++)
in(i);
for(i=n;i<2*n;i++)
{
in(i);
int u=out(i);
if((sum[u]-sum[i-n])>=0)
ans++;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: