(模拟)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(1in) such that for every j(1j<i),bj+1=bj+d1 and for every j(ij<n),bj+1=bj+d2.

Teacher Mai has a sequence a1,a2,,an. He wants to know how many intervals [l,r](1lrn) 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(1n105,|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=1; i<=n; i++)
            scanf("%d", &a[i]);

        memset(dp, 0, sizeof(dp));

        for(i=1; i<n; i++)
        {
            if(a[i+1]==a[i]+d1)
                dp[i+1] = 1;
            else if(a[i+1]==a[i]+d2)
                dp[i+1] = 2;
            else dp[i+1] = 3;
        }

        LL ans=0, tmp=0;

        for(i=1; i<=n; i++)
        {
            if(dp[i]==1)
            {
                if(dp[i-1]==2) tmp = 1;
                else  tmp++;

                ans = ans + tmp +1;
            }
            else if(dp[i]==2)
            {
                tmp++;
                ans = ans + tmp + 1;
            }
            else
            {
                ans ++;
                tmp = 0;
            }
        }

        printf("%lld
", ans);

    }
    return 0;
}
#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 = 0;
        memset(a, 0, sizeof(a));

        scanf("%d", &x);

        for(i=1; i<n; i++)
        {
            scanf("%d", &y);
            a[i] = y-x;
            x = y;
        }

        for(i=1; i<n; i++)
        {
            if(a[i]==d1)
            {
                if(a[i-1]!=d1)  s1 = 0;

                s1++;
                sum += s1;  ///sum加上当前公差为的d1序列长度
                s2 = 0;     ///s2进行清零
            }
            else if(a[i]==d2)
            {
                s2++;
                sum += s1 + s2;  ///加上公差为d2和前半段为d1后半段为d2的序列长度
            }
            else
                s1 = s2 = 0;
        }

        printf("%I64d
", sum+n);  ///n是只有一个元素的时候
    }

    return 0;
}
勿忘初心
原文地址:https://www.cnblogs.com/YY56/p/4749697.html