题目大意: 给定一个长度为n的循环序列。从n个不同位置開始,问有几个位置使得一下情况成立:全部前缀的和都大等于0(n <=1000000).

下午的训练赛。之前没学过单调队列所以用的线段树,一直tle,到了结束也没搞出来。晚上回来看了下,能够用单调队列来做。时间复杂度为O(n)。

这道题事实上就是看从每一个位置開始的最小前缀和是否大于零。可是这是有规律的。

比方从元素1(下面将元素a[i]简写为i)開始的全部前缀和为1,1+2,...,1+2+3+..+n

从2開始的全部前缀和为2, 2+3 ,....2+3+4+..+n+1

那么当我们算出以1开头的全部前缀的最小值(记为u)时,那么以2开头的全部前缀和的最小值为min(2+1, 2+3+1,...,2+3+4+..+n+1, 2+3+4+..+n+1+1)-1,

也就是说我们每次把sum[n]+sum[i]加入到队列中,求出最小值后减去sum[i]就是以i+1为首的全部前缀和的最小值。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
using namespace std; const int maxn = 1000000 + 1000;
const int INF = 0x3f3f3f3f;
int a[1000000+100];
int n;
int su[1000000+100]; int qmin[maxn], vmin[maxn], hmin = 1, tmin = 0;
void Min(int a, int i) { //第i个元素a入队
while(hmin<=tmin && vmin[hmin] <= i-n) hmin++; //超范围队首出队
//while(hmin<=tmin && qmin[tmin]>=a) tmin--; //不符合要求队尾出列
int l = hmin, r = tmin;
while(l <= r) {
int m = l+(r-l)/2;
if(qmin[m] >= a) r = m - 1;
else l = m + 1;
}
tmin = ++r;
qmin[tmin] = a;
vmin[tmin] = i;
} int main() {
//freopen("input.txt", "r", stdin);
while(scanf("%d", &n) == 1 && n) {
hmin = 1, tmin = 0;
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
su[i] = su[i-1] + a[i];
}
int ans = 0;
for(int i = 1; i < n; i++) Min(su[i], i);
for(int i = n; i < 2*n; i++) {
Min(su[n]+su[i-n], i);
if(qmin[hmin]-su[i-n] >= 0) ans++;
}
cout << ans << endl;
}
return 0;
}

HDU 4193 Non-negative Partial Sums(单调队列)的更多相关文章

  1. hdu 4193 Non-negative Partial Sums 单调队列。

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  2. hdu 3706 Second My Problem First 单调队列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 M ...

  3. HDU 4122 Alice's mooncake shop 单调队列优化dp

    Alice's mooncake shop Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...

  4. hdu 4122 Alice's mooncake shop(单调队列)

    题目链接:hdu 4122 Alice's mooncake shop 题意: 有n个订单和可以在m小时内制作月饼 接下来是n个订单的信息:需要在mon月,d日,year年,h小时交付订单r个月饼 接 ...

  5. hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)

    题目链接:hdu 3415 Max Sum of Max-K-sub-sequence 题意: 给你一串形成环的数,让你找一段长度不大于k的子段使得和最大. 题解: 我们先把头和尾拼起来,令前i个数的 ...

  6. HDU 6444 Neko's loop(单调队列)

    Neko has a loop of size nn. The loop has a happy value aiai on the i−th(0≤i≤n−1)i−th(0≤i≤n−1) grid.  ...

  7. HDU 4123(树的直径+单调队列)

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. 【HDU】3401:Trade【单调队列优化DP】

    Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. ACM学习历程—HDU 5289 Assignment(线段树 || RMQ || 单调队列)

    Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fro ...

  10. HDU 5945 Fxx and game (DP+单调队列)

    题意:给定一个 x, k, t,你有两种操作,一种是 x - i (0 <= i <= t),另一种是 x / k  (x % k == 0).问你把x变成1需要的最少操作. 析:这肯定是 ...

随机推荐

  1. tony_LVS DR模式 RealServer 为 Windows客户端配置

    LVS   DR模式  Windows 2000,Windows2003客户端配置   控制面板-添加硬件-选“是,我已经连接了此设备”点击下一步-在列表中选择添加新的硬件设备-选“安   装我充从手 ...

  2. tony_nginx的安装和配置

    yum安装nginx Centos默认的yum源里没有nginx,需要手动添加源,有两种方法: 使用nginx提供的一个源设置安装包 nginx下载页面:http://nginx.org/en/dow ...

  3. SpringCloud系列十二:手动创建Feign

    1. 回顾 上文讲解了自定义Feign.但是在某些场景下,前文自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign. 本文围绕以下场景,为大家讲解如何手动 ...

  4. Angular2升级到Angular4

    angular4终于在两天前发布了正式版本,那么怎么升级呢?其实angular2和angular4之间属于平滑过渡,并不像1和2之间颠覆性的重写代码. npm uninstall -g @angula ...

  5. 编译安装git

    http://zhaohe162.blog.163.com/blog/static/38216797201472185321661/

  6. 调整Redmine的用户显示格式

    在 Redmine 中新建用户时是酱紫的: 必须指定姓氏.名字.然后 Redmine 默认是按"名字 姓氏"这样的方式显示用户.比方"张三",会显示成" ...

  7. iptables修改

    https://fedoraproject.org/wiki/How_to_edit_iptables_rules?rd=User_talk:Rforlot Listing Rules Current ...

  8. Google Chrome v48.0.2564.

    http://www.pcpop.com/doc/1/1819/1819996.shtml 摘要:谷歌浏览器Chrome Stable 稳定版迎来例行升级,新版本号为v48.0.2564.82,上一版 ...

  9. 【Ubuntu安装,ATX基于uiautomator2】之安装步骤

    Ubuntu系统下安装uiautomator2步骤: 1.安装命令: pip install --upgrade --pre uiautomator2 但是报错: Command "pyth ...

  10. Spring MVC配置静态资源和资源包教程

    1- 介绍 这篇教程文章是基于: Spring 4 MVC 2- 创建一个项目 File/New/Other.. 输入: Group ID: com.yiibai Artifact ID: Sprin ...