hdu5400--Arithmetic Sequence

题目大意:给出一个数列,求有多少个区间[l, r]满足,存在一个i,l <= i <= r  ,使得j (l <= j < i)b(j+1) = b(j) + d1,并且j (j <= i < = r)b(j+1) = b(j) + d2


分析:暴力搜索就行。

flag表示从这一次开始搜的位置,到现在这个位置都满足要求。中间这些区间就相当于等差数列求和。


代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 100010;
int n, d1, d2;
long long ans;
long long a[maxn];
int flag;

void dfs2(int x) {
    if(x == n) return;
    if(a[x+1] == a[x]+d2) {
        flag = x+1;
        dfs2(x+1);
    }
}

bool dfs1(int x) {
    if(x == n) return true;
    if(a[x+1] == a[x]+d1) {
        flag = x+1;
        dfs1(x+1);
        return true;
    }
    else if(a[x+1] == a[x]+d2) {
        flag = x+1;
        dfs2(x+1);
        return true;
    }
    return false;
}


int main() {
    while(~scanf("%d%d%d", &n, &d1, &d2)) {
        for(int i = 1; i <= n; i++)
            scanf("%I64d", &a[i]);
        ans = (long long)n;
        flag = 1;
        for(int i = 1; i < n; i = flag) {
            dfs1(i);
            if(flag != i)ans += (long long)(flag-i)*(1+flag-i)/2;
            else flag++;
        }
        printf("%I64d\n", ans);

    }
}


你可能感兴趣的:(hdu5400--Arithmetic Sequence)