Hdu 5400 Arithmetic Sequence 数学推理
2017-08-17 04:54
489 查看
Arithmetic Sequence
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1802 Accepted Submission(s): 783[align=left]Problem Description[/align]A sequence b1,b2,⋯,bn are called (d1,d2)-arithmetic sequence if and only if there exist i(1≤i≤n) such that for every j(1≤j<i),bj+1=bj+d1 and for every j(i≤j<n),bj+1=bj+d2.Teacher Mai has a sequence a1,a2,⋯,an. He wants to know how many intervals [l,r](1≤l≤r≤n) there are that al,al+1,⋯,ar are (d1,d2)-arithmetic sequence. [align=left]Input[/align]There are multiple test cases.For each test case, the first line contains three numbers n,d1,d2(1≤n≤105,|d1|,|d2|≤1000), the next line contains n integers a1,a2,⋯,an(|ai|≤109). [align=left]Output[/align]For each test case, print the answer. [align=left]Sample Input[/align]5 2 -20 2 0 -2 05 2 32 3 3 3 3 [align=left]Sample Output[/align]125 [align=left]Author[/align]xudyh [align=left]Source[/align]2015 Multi-University Training Contest 9给你长度为n的序列,求有多少个连续的子序列满足前一半公差d1,后一半公差d2.
先求出连续的公差d1、d2的序列长度。然后讨论:
1.子序列长度为1,共n个符合要求的序列。
2.子序列公差为d1或d2,设长度为len,共有len*(len+1)/2个子序列符合要求。
3.公差d1、d2的序列连在一起,我们在前一段选一个头,后一段选一个尾。设长度分别为lena、lenb,
共有lena*lenb种答案。
#include <cstdio>#include <iostream>#include <string.h>#include <string>#include <map>#include <queue>#include <vector>#include <set>#include <algorithm>#include <math.h>#include <cmath>#include <stack>#define mem0(a) memset(a,0,sizeof(a))#define meminf(a) memset(a,0x3f,sizeof(a))using namespace std;typedef long long ll;typedef long double ld;const int maxn=1000005,inf=0x3f3f3f3f;const ll llinf=0x3f3f3f3f3f3f3f3f;const ld pi=acos(-1.0L);ll a[maxn],lena[maxn],lenb[maxn];int main() {int n,i;ll d1,d2;while (scanf("%d%lld%lld%lld",&n,&d1,&d2,&a[1])!=EOF) {mem0(lena);mem0(lenb);for (i=2;i<=n;i++) {scanf("%lld",&a[i]);if (a[i]-a[i-1]==d1) lena[i]=lena[i-1]+1; elseif (a[i]-a[i-1]==d2) lenb[i]=lenb[i-1]+1;}ll ans=n,last=-1;lena[n+1]=lenb[n+1]=0;for (i=2;i<=n+1;i++) {if (lena[i-1]!=0&&lena[i]==0) {ans+=lena[i-1]*(lena[i-1]+1)/2;last=i-1;} else if (lenb[i-1]!=0&&lenb[i]==0) {if (last==i-1-lenb[i-1]) ans+=lena[last]*lenb[i-1];ans+=lenb[i-1]*(lenb[i-1]+1)/2;}}printf("%lld\n",ans);}return 0;}
相关文章推荐
- hdu 1205 吃糖果(数学:推理||数据结构:优先队列)
- HDU - 5974 A Simple Math Problem(ICPC2016 大连现场,简单的数学推理)
- hdu 4611 Balls Rearrangement(数学:推理+模拟)
- HDU 2058 The sum problem Time (等差和推理之类数学题)
- hdu 5399(数学推理)
- HDU 5400 Arithmetic Sequence(数学,容斥)
- HDU 5400 Arithmetic Sequence(数学)——多校练习9
- hdu 4970 Just Random(数学:推理)
- A simple problem HDU-2522 【数学技巧】
- ACM学习历程—HDU 5512 Pagodas(数学)
- hdu 1071 The area(数学题)
- hdu 2080 夹角有多大II (数学)
- HDU - 4810 Wall Painting(组合数学)
- 组合数学 + 大数乘法 + 大数除法 之 hdu 1261 字串数
- 2016"百度之星" - 初赛(Astar Round2A)--HDU 5690 |数学转化+快速幂
- HDU-4923 Room and Moor 多校对抗之数学题
- HDU 1041 Computer Transformation 数学DP题解
- HDU 4932 Miaomiao's Geometry(推理)
- 数学推理相关的几个名词及LaTeX用法
- HDU 1018 Big Number (数学题)