题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=5400
Arithmetic Sequence
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 312 Accepted Submission(s): 163
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.
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) .
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 Output
12 5
题意就是给你一个输入n,d1,d2 和一个个数为n的数列。问你这个数列中成等差为d1或d2或者前一部分等差为d1,后一部分等差为d2的子序列有多少个。
需要注意的是有的变量题目中给的是10的五次方,要用int64,我因为这个WA了。
#include<stdio.h>
int main()
{
__int64 last,temp,d;
__int64 n,b[2];
while(~scanf("%I64d",&n))
{
__int64 flag=0,len=1;
__int64 sum=n;
scanf("%I64d%I64d",&b[0],&b[1]);
scanf("%I64d",&last);
for(int i=1;i<n;i++){
scanf("%I64d",&temp);
d=temp-last;
if(flag==0){
if(d==b[0]) len++;
else if(d==b[1]){
len++;
flag++;
}
else{
sum+=len*(len-1)/2;
// printf("%I64d\n",sum);
len=1;
}
}
else if(flag==1){
if(d==b[1]) len++;
else if(d==b[0]){
sum+=len*(len-1)/2;
// printf("%I64d\n",sum);
len=2;
flag=0;
}
else{
sum+=len*(len-1)/2;
// printf("%I64d\n",sum);
len=1;
flag=0;
}
}
last=temp;
}
sum+=len*(len-1)/2;
printf("%I64d\n",sum);
}
return 0;
}