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 }
View Code

 

转载于:https://www.cnblogs.com/UniqueColor/p/4740444.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值