HDU 4193 Non-negative Partial Sums 【单调队列】
来源:互联网 发布:php soapclient 超时 编辑:程序博客网 时间:2024/04/29 19:30
题目链接
题意
给一串长度为n的数列,问数列中存在多少个元素,使得以这个元素为首的长度为(1,2,…,n)的连续子序列都大于0(如果子序列超出了原数列,则又从第一个元素开始)?
分析
首先这种涉及循环同构的题,通常还是把整个数组复制一遍接到原数组后面这样处理。考虑数据量,n在1e6,估计
于是我们做这样的转化:
设第i个元素的前缀和为
那么这样已处理过后,全部区间和大于0就转化为了求出当前首元素开头的所有前缀的最大值,这个最大值大于这个元素的前缀和就行了。接下来求这个元素开头的所有前缀和的最大值是典型的滚动区间问题,用单调队列或者线段树解决即可。
AC代码
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cctype>#include <cstdlib>#include <cstring>#include <vector>#include <set>#include <string>#include <map>#include <queue>#include <deque>#include <list>#include <sstream>#include <stack>using namespace std;#define cls(x) memset(x,0,sizeof x)#define inf(x) memset(x,0x3f,sizeof x)#define neg(x) memset(x,-1,sizeof x)#define ninf(x) memset(x,0xc0,sizeof x)#define st0(x) memset(x,false,sizeof x)#define st1(x) memset(x,true,sizeof x)#define INF 0x3f3f3f3f#define lowbit(x) x&(-x)#define bug cout<<"here"<<endl;//#define debugdeque<pair<long long,int> > auto_que;long long sum[2000100];void auto_insert(long long v,int x){ while(!auto_que.empty()&&auto_que.back().first>=v) auto_que.pop_back(); auto_que.push_back(make_pair(v,x)); return;}long long getfront(int x,int k){ while(auto_que.front().second<=x-k) auto_que.pop_front(); return auto_que.front().first;}int main(){ #ifdef debug freopen("E:\\Documents\\code\\input.txt","r",stdin); freopen("E:\\Documents\\code\\output.txt","w",stdout); #endif int n; while(scanf("%d",&n)&&n) { auto_que.clear(); long long tem=0; int temp=0; sum[0]=0; for(int i=1;i<=n;++i) { scanf("%d",&temp); tem+=temp; sum[i+n]=temp; sum[i]=tem; auto_insert(tem,i); } for(int i=n+1;i<=2*n;++i) { tem+=sum[i]; sum[i]=tem; } int res=0; for(int i=n+1;i<=2*n;++i) { auto_insert(sum[i],i); if(getfront(i,n)>=sum[i-n]) ++res; } cout<<res<<endl; } return 0;}
0 0
- hdu Non-negative Partial Sums(单调队列)
- HDU 4193 Non-negative Partial Sums(单调队列)
- HDU OJ 4193 Non-negative Partial Sums 【单调队列】
- HDU-4193 Non-negative Partial Sums 单调队列
- 单调队列-hdu-4193-Non-negative Partial Sums
- 单调队列—— HDU 4193 Non-negative Partial Sums
- 【单调队列】hdu 4193 Non-negative Partial Sums
- hdu 4193 Non-negative Partial Sums 单调队列
- HDU 4193 Non-negative Partial Sums(单调队列)
- HDU 4193 Non-negative Partial Sums【单调队列】
- HDU 4193 Non-negative Partial Sums 【单调队列】
- HDU 1193 Non-negative Partial Sums / 单调队列
- HDU Non-negative Partial Sums (单调队列)
- Hdu4193 Non-negative Partial Sums (单调队列)
- Non-negative Partial Sums 单调队列
- 【HDU4193】Non-negative Partial Sums-单调队列
- HDOJ-4193-Non-negative Partial Sums【单调队列】
- HDU 4193 Non-negative Partial Sums(想法题,单调队列)
- 课程练习三-1002-problem B
- Exception in thread "main" org.hibernate.QueryException: illegal attempt to dereference collection
- hdu 4284 状压dp
- 两道经典的java面试题
- android仿天天动听歌曲自动滚动view
- HDU 4193 Non-negative Partial Sums 【单调队列】
- 深入浅出之正则表达式(一)
- Hadoop2.6集群环境搭建(伪分布式)
- leetcode-5. Longest Palindromic Substring
- dex文件格式入门
- 面试题:用两个栈实现一个队列
- STACK 非标准版
- maven基础篇(6)-maven仓库
- 在listView中显示json数据出现的问题及解决方法