(模拟)Arithmetic Sequence -- HDU -- 5400

时间:2023-03-10 05:35:34
(模拟)Arithmetic Sequence -- HDU -- 5400

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5400

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 875    Accepted Submission(s): 386

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
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h> #define N 100005
#define LL long long int a[N], dp[N]; int main()
{
int n, d1, d2; while(scanf("%d%d%d", &n, &d1, &d2)!=EOF)
{
int i; for(i=; i<=n; i++)
scanf("%d", &a[i]); memset(dp, , sizeof(dp)); for(i=; i<n; i++)
{
if(a[i+]==a[i]+d1)
dp[i+] = ;
else if(a[i+]==a[i]+d2)
dp[i+] = ;
else dp[i+] = ;
} LL ans=, tmp=; for(i=; i<=n; i++)
{
if(dp[i]==)
{
if(dp[i-]==) tmp = ;
else tmp++; ans = ans + tmp +;
}
else if(dp[i]==)
{
tmp++;
ans = ans + tmp + ;
}
else
{
ans ++;
tmp = ;
}
} printf("%lld\n", ans); }
return ;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h> #define N 110000 int a[N]; int main()
{
int n, i, x, y, d1, d2; while(scanf("%d%d%d", &n, &d1, &d2)!=EOF)
{
__int64 s1, s2, sum; s1 = s2 = sum = ;
memset(a, , sizeof(a)); scanf("%d", &x); for(i=; i<n; i++)
{
scanf("%d", &y);
a[i] = y-x;
x = y;
} for(i=; i<n; i++)
{
if(a[i]==d1)
{
if(a[i-]!=d1) s1 = ; s1++;
sum += s1; ///sum加上当前公差为的d1序列长度
s2 = ; ///s2进行清零
}
else if(a[i]==d2)
{
s2++;
sum += s1 + s2; ///加上公差为d2和前半段为d1后半段为d2的序列长度
}
else
s1 = s2 = ;
} printf("%I64d\n", sum+n); ///n是只有一个元素的时候
} return ;
}