HDU 4193 Non-negative Partial Sums【单调队列】
2016-03-30 11:47
441 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4193题意:
给定序列,可以把后面的连续的部分移到最前面来,问多少种移法使得最终得到的序列的前i项和均大于等于0(1≤i≤n)?分析:
先将数组前后拼接起来,记录每个位置的前缀和。然后去找长度为n的滑动窗口,在这个窗口内,要保证前i项和大于等于0,也即区间[i,n+i]之间的找到的最小的前缀和要比a[i−1]大。而不涉及修改,这个最小前缀和的获取和维护就利用单调队列即可~代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn = 2e6 + 5; int q[maxn], a[maxn]; int head, rear; int n, cnt; void inque(int i) { while(rear >= head && a[q[rear]] >= a[i]) rear--; q[++rear] = i; } void outque(int i) { if(q[head] < i - n + 1){ head++; } } int main (void) { while(scanf("%d", &n) && n){ head = 0, rear = 0; memset(a, 0, sizeof(a)); memset(q, 0, sizeof(q)); for(int i = 0; i < n; i++){ scanf("%d", &a[i]); a[n + i] = a[i]; } for(int i = 1; i < 2 * n; i++) a[i] += a[i - 1]; for(int i = 0; i < n; i++) inque(i); int cnt = 0; for(int i = n; i < 2 * n; i++){ outque(i); inque(i); if(a[q[head]] - a[i- n] >= 0) cnt++; } printf("%d\n", cnt); } return 0; } /* 5 -1 -2 -3 -4 -5 */
相关文章推荐
- Trident WordCount代码示例
- 类与 对象 概念 break continue
- httpclient用getStatusCode
- Python函数参数传递:传值还是传引用
- Leetcode 217
- leetcode 42. Trapping Rain Water
- 机器学习基础(三十三)—— 皮尔逊相关度评价
- VC API常用函数简单例子大全
- Java学习笔记-笔试考点
- javascript的原型链简单了解
- 整理关于Windows自旋锁实现
- 2016-03-29 面试总结
- 循环广告栏的实现一
- linux64位shellcode代码注入
- Html5之高级-7 HTML5 Chart.js(概述、入门、使用)
- ActivityGroup实现Tab功能
- 设计模式-工厂方法模式
- Java中Collection和Collections的区别(引用自:http://www.cnblogs.com/dashi/p/3597937.html)
- Camera.Parameters 参数
- MySQL 添加列,修改列,删除列