fzu1914
2015-01-27 15:53
316 查看
FZU 1914 Funny Positive Sequence
2011-04-10 15:35:03| 分类: FZU | 标签:fzu 1914 funny positive sequence |举报|字号 订阅Problem 1914 Funny Positive Sequence
Time Limit: 1000 mSec Memory Limit : 32768 KB
http://acm.fzu.edu.cn/problem.php?pid=1914Problem Description
There are n integers a1,a2,…,an-1,an in the sequence A, the sum of these n integers is larger than zero. Thereare n integers b1,b2,…,bn-1,bn in the sequence B, B is the generating sequence of A and bi = a1+a2,+…+ai (1≤i≤n).
If the elements of B are all positive, A is called as a positive sequence.
We left shift the sequence A 0,1,2,…,n-1 times, and get n sequences, that is showed as follows:
A(0): a1,a2,…,an-1,an
A(1): a2,a3,…,an,a1
…
A(n-2): an-1,an,…,an-3,an-2
A(n-1): an,a1,…,an-2,an-1
Your task is to find out the number of positive sequences in the set { A(0), A(1), …, A(n-2), A(n-1) }.
Input
The first line of the input contains an integer T (T <= 20), indicating the number of cases. Each case begins with a line containing one integer n (1 <= n <= 500,000), the number of elements in the sequence. The next line contains n integers ai(-2,000,000,000≤ai≤2,000,000,000,1≤i≤n),the value of elements in the sequence.
Output
For each test case, print a line containing the test case number (beginning with 1) and the number of positive sequences.Sample Input
23
1 1 -1
8
1 1 1 -1 1 1 1 -1
Sample Output
Case 1: 1Case 2: 4
Source
2010年全国大学生程序设计邀请赛(福州)这种题目就得思维开放的思考
版本1
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> using namespace std; //typedef long long ll; #define MAXN 500010 int t, n, m; int vis[MAXN],next[MAXN],sum[MAXN],vnext[MAXN]; int a[MAXN]; int main() { int i, j; //freopen("a.txt", "r", stdin); scanf("%d", &t); int count = 1; while(t--) { scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); int ans = n; memset(vis, 0, sizeof(vis)); memset(vnext, 0, sizeof(vnext)); for(i = n-1; i>=0; i--) //从后往前扫,发现-的则往前(循环)叠加至为+或者标记全满了(即ans=0) { if(a[i] <= 0 && !vis[i]) { __int64 num = 0,flag=0; for(j = i; ans>0; j--) { if(vnext[j] && a[j]<=0) { num+=sum[j]; j=next[j]; } else num += a[j]; if(num > 0) { sum[i]=num; next[i]=j; vnext[i]=1; break; } else { vis[j] = 1; ans--; } if(j == 0) j = n; else if(j == i + 1) break; } } } printf("Case %d: %d\n", count++, ans); } return 0; }
版本2
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> using namespace std; #define MAXN 500010 int t, n, m; int vis[MAXN],next[MAXN],sum[MAXN],vnext[MAXN]; __int64 a[MAXN]; int main() { int i, j; scanf("%d", &t); int count = 1; while(t--) { scanf("%d", &n); for(i=j=0; i < n; i++) { scanf("%I64d", &a[++j]); while(a[j]<=0 && j>1 )a[j-1]+=a[j],j--;//遇到<=0的就往前压缩到为+或者j=1 } n=j; int ans = n; memset(vis, 0, sizeof(vis)); memset(vnext, 0, sizeof(vnext)); //for(i = n; i>=1; i--) i=1; //最后最多只有第一位为负数 { if(a[i] <= 0 && !vis[i]) { __int64 num = 0,flag=0; for(j = i; ans>0; j--) { if(vnext[j] && a[j]<=0) { num+=sum[j]; j=next[j]; } else num += a[j]; if(num > 0) { sum[i]=num; next[i]=j; vnext[i]=1; break; } else { vis[j] = 1; ans--; } if(j == 1) j = n+1; else if(j == i + 1) break; } } } printf("Case %d: %d\n", count++, ans); } return 0; }
相关文章推荐
- FZU 1914 Funny Positive Sequence
- FZU 1914 Funny Positive Sequence
- fzu 1914 Funny Positive Sequence
- FZU 1008 Hay Points
- FZU 1685 跑跑卡丁车
- FZU 1053 Happy 2004
- 凌台公式的应用fzu1010
- FZU 1502 Letter Deletion
- Fzu_1060 Fibonacci数列
- hdoj1914(稳定婚姻问题)
- fzu 1894
- FZU 1973 How many stars(2010福州网选题)
- HDU 3974 Assign the task 2011 Multi-University Training Contest 14 - Host by FZU 线段树
- 计算几何初步——共面判断(FZU1393)
- FZU 1977 Pandora adventure
- FZU_1675 The Seventy-seven Problem
- FZU 1057 a^b
- ZOJ 1914 Arctic Network(解题报告)
- BZOJ 1914 [Usaco2010 OPen]Triangle Counting 数三角形
- FZU 1692 Key problem (构造矩阵)