HDU 4193

题意:给n个数字组成的序列(n <= 10^6)。求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0.

思路:

这题看到数据规模认为仅仅能用最多O(nlogn)的算法。然后想到了之前刚做过的有关最小表示法的题。但还没证明出一个做这题有效的算法出来。

后来看过题解。发现用的最多的方法是单调队列,然而我对这个知识点知之甚少orz

/*科普君:from单调队列

单调队列是指:队列中元素之间的关系具有单调性。并且,队首和队尾都能够进行出队操作。仅仅有队尾能够进行入队操作。

以单调不减队列为例:队列内的元素(e1。e2,e3...en)存在(e1<=e2<=e3<=...<=en)的关系。所以队首元素e1一定是最小的元素。与优先队列不同的是,当有一个新的元素e入队时,先要将队尾的全部大于e的元素弹出,以保证单调性,再让元素e入队尾。

比如这样一组数(1。3,2,1,5,6)。进入单调不减队列的步骤例如以下:

1入队,得到队列(1)。

3入队,得到队列(1,3);

2入队,这时,队尾的的元素3>2,将3从队尾弹出。新的队尾元素1<2,不用弹出。将2入队,得到队列(1,2);

1入队,2>1,将2从队尾弹出,得到队列(1,1)。

5入队,得到队列(1。1。5)。

6入队,得到队列(1,1,5,6)*/

利用单调队列的解题思路是://參考:http://blog.csdn.net/code_pang/article/details/14228969

首先用循环序列的一般处理方法。将数列复制并接在一起。

然后处理出来sum,sum[i]表示a[1]~a[i]的和。

设S[i]为长度为n的子序列前i项之和,如果子序列的最后一个数的下标为就j,那么j-n+1 <= i <= j,S[i] = A[j-n+1] + A[j-n] + … + A[i],.

Sum[i]和S[i]的转化关系为:当前子序列的末尾数的下标为j,S [i] =Sum[i] – Sum[j-n]。

题中要找满足全部S(i) >= 0条件的n长子序列,所以仅仅须要找出最小的S(i),假设它的值都大于等于0的话,该序列就满足条件,ans++就可以。

使用单调递增队列来寻找最小的S[i]。

其它解题思路://參考:http://blog.csdn.net/ice_crazy/article/details/9697885

先考虑假设整个序列和sum<0,那么肯定ans=0;

再考虑一个性质,假设当前的长度为n的序列满足题中条件,那么我们能够仅仅将最后的元素放到首位。假设移动前序列满足条件。则此次移动后得到的序列是否满足条件便由此元素决定。

    假设这个元素 >= 0。那么这次移动得到的新队列相同满足题中的条件,ans++;

    假设这个元素 < 0,则再次移动并累加移动元素值,直到某次移动后这个累计

值 >= 0。此时ans能够+1,而且要把这个累计值清零。

当移动后序列又成为原合法序列时。结束移动。

code:(后一种解题思路)

/*
* @author Novicer
* language : C++/C
*/
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<ctime>
#include<iomanip>
using namespace std;
const double eps(1e-8);
typedef long long lint; const int maxn = 1000000 + 5;
int a[maxn]; int main(){
int n;
while(cin >> n && n){
int cnt = 0;
int total = 0;
for(int i = 1 ; i <= n ; i++){
scanf("%d",&a[i]);
total += a[i];
}
if(total < 0){
cout << 0 << endl;
continue;
}
else{
int l = 0;
int pos = n;
int ans = 0;
int sum = 0;
while(l <= pos){
sum += a[l];
l++;
while(sum < 0){
sum += a[pos];
pos--;
}
}
// cout << l << endl;
// cout << pos << endl;
int tmp = 0;
while(pos >= 1){
if(tmp >= 0) ans ++;
if(tmp < 0) tmp += a[pos];
else if(a[pos] < 0) tmp = a[pos];
pos--;
}
cout << ans << endl;
}
}
return 0;
}

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

  1. hdu 5289 rmp+二分+枚举后界 or单调队列 ****

    好题~~ 给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数,枚举后界~~ 又是一种没见过的方法,太弱了/(ㄒoㄒ)/~~ #include <cstdio ...

  2. hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解

    题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手 ...

  3. HDU 5596 ——GTW likes gt——————【想法题】

    GTW likes gt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  4. hdu 5090 Game with Pearls (额,, 想法题吧 / 二分图最大匹配也可做)

    题意: 给你N个数,a1,,,,an.代表第i个管子里有ai个珍珠. 规定只能往每根管里增加k的倍数个珍珠. 如果存在一套操作,操作完毕后可以得到1~N的一个排列,则Jerry赢,否则Tom赢. 问谁 ...

  5. HDU 4123 Bob’s Race 树的直径+单调队列

    题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...

  6. HDU 5380 Travel with candy (贪心,单调队列)

    题意: 有n+1个城市按顺序分布在同一直线上,现在需从0号城市按顺序走到n号城市(保证可达),从0号城市到i号城市需要消耗ai个糖果,每个城市都可以通过买/卖糖果来赚取更多的钱,价格分别是buyi和s ...

  7. HDU 3415 Max Sum of Max-K-sub-sequence 单调队列题解

    本题又是一题单调队列题解. 技巧就是须要计算好前n项和Sn = a1 + a2 + ... an 这样方便处理. 记录一条单调队列,其意义是: q(head), q(head+1), ...q(tai ...

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

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

  9. hdu 4193 Non-negative Partial Sums

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4193 题意:给出一个n数列,要求把前i(1<=i<=n)个数移到剩余数列的后面形成新的数列 ...

随机推荐

  1. css中单位px和em,rem的区别[转载]

    PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firefox能够调整px和em,rem,但是96%以上 ...

  2. 从ELK到EFK演进

    背景 作为中国最大的在线教育站点,目前沪江日志服务的用户包含网校,交易,金融,CCTalk 等多个部门的多个产品的日志搜索分析业务,每日产生的各类日志有好十几种,每天处理约10亿条(1TB)日志,热数 ...

  3. 利用Python循环(包括while&for)各种打印九九乘法表

    一.for循环打印九九乘法表 #注意:由于缩进在浏览器不好控制,请大家见谅,后续会有图片传入. 1.1 左下角 for i in range(1,10): for j in range(1,i+1): ...

  4. 轻松驾驭Tomcat

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...

  5. 开源代码学习之Tinyhttpd

    想开始陆续研究一些感兴趣的开源代码于是先挑一个代码量短的来过渡一下,写这篇博客的目的是记录下自己学习的过程.Tinyhttpd算是一个微型的web服务器,浏览器与Web服务器之间的通信采用的是Http ...

  6. AutoMapper IIS回收引发的 未将对象引用设置到对象实例

    一.前言 最近使用AutoMapper的时候,一段时间久会产生System.NullReferenceException:未将对象引用设置到对象的实例.这个问题.后来通过测试,发现部署在IIS上的站点 ...

  7. IntelliJ配置jenkins服务的Crumb Data

    近期在做jenkins测试,IntelliJ并没有自动安装jenkins服务器,因此需要自己添加,但是如果不配置Crumb Data,jenkins的服务就不能使用. 首先在服务器中开启CSRF服务, ...

  8. github创建远程仓库

    创建远程仓库 当你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一 ...

  9. httpwebrequest 用GET方法时报无法发送具有此谓词类型的内容正文

    如下一段小程序,运行结果报无法发送具有此谓词类型的内容正文的错误,其实原因很简单,因为用的是GET的方式进行提交,而GetRequestStream()是用来在post提交的时候写post的内容的流, ...

  10. Mac上编译并运行Android5.0源码

    下载.配置环境.build和运行参考的都是Android Source提供的文档,包括:Initializing a Build Environment,Downloading the Source和 ...