hdu 5400 Arithmetic Sequence(模拟)
Problem Description
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.
Input
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).
Output
For each test case, print the answer.
Sample Input
5 2 -2
0 2 0 -2 0
5 2 3
2 3 3 3 3
Sample Output
12
5
Author
xudyh
Source
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define N 100006 6 #define ll long long 7 int n,k1,k2; 8 int a[N]; 9 int dp[N]; 10 int main() 11 { 12 while(scanf("%d%d%d",&n,&k1,&k2)==3) 13 { 14 for(int i=1;i<=n;i++) 15 { 16 scanf("%d",&a[i]); 17 } 18 19 memset(dp,0,sizeof(dp)); 20 for(int i=1;i<n;i++) 21 { 22 if(a[i+1]==a[i]+k1) 23 dp[i+1]=1; 24 else if(a[i+1]==a[i]+k2) 25 dp[i+1]=2; 26 else dp[i+1]=3; 27 } 28 29 ll ans=0; 30 ll tmp=0; 31 for(int i=1;i<=n;i++) 32 { 33 if(dp[i]==1) 34 { 35 if(dp[i-1]==2) 36 { 37 tmp=1; 38 } 39 else 40 tmp++; 41 ans=ans+tmp+1; 42 } 43 else if(dp[i]==2) 44 { 45 tmp++; 46 ans=ans+tmp+1; 47 } 48 else 49 { 50 ans++; 51 tmp=0; 52 } 53 54 } 55 printf("%I64d\n",ans); 56 } 57 return 0; 58 }