hdu5399(模拟)

来源:互联网 发布:淘宝添加背景图片代码 编辑:程序博客网 时间:2024/05/22 17:23

题意:

在一个序列中找出连续的子序列,满足在这个子序列中从某一个位置开始,左侧是一公差是d1的等差序列,右侧是一个公差是d2的等差序列,问能找到多少个子序列。


思路:

模拟,不多说,贴队友的代码。


代码:

#include <iostream>#include <cstring>#include <cstdio>using namespace std;const long long maxn = 100005;long long a[maxn];long long L[maxn], R[maxn];int main() {    long long n, d1, d2;//    freopen("a.txt","r",stdin);    while(EOF != scanf("%I64d%I64d%I64d",&n, &d1, &d2)) {        for(long long i = 1; i <= n; i++) {            scanf("%I64d",&a[i]);        }        memset(L, 0, sizeof(L));        memset(R,0, sizeof(R));        a[0] = 100000000000;        a[++n] = 100000000000;//        for(long long i = 0; i <= n; i++) {//            printf("%I64d ", a[i]);//        }puts("");        long long ans = n-1;        long long num = 1;        long long lx, rx = 1;        for(long long i = 2; i <= n; i++){            if(a[i] - a[i - 1] == d1) {                num++;                if(num == 2) {                    lx = i - 1;                }            }            else {                if(num >= 2) {                    long long x = num - 1;                    ans += (x * (x + 1) / 2);                    rx = i - 1;                    L[rx] = lx;                }                num = 1;            }        }        if(d1 != d2) {            num = 1;            lx = 1;            rx = 1;            for(long long i = 2; i <= n; i++){                if(a[i] - a[i - 1] == d2) {                    num++;                    if(num == 2) {                        lx = i - 1;                    }                }                else {                    if(num >= 2) {                        long long x = num - 1;                        ans += (x * (x + 1) / 2);                        rx = i - 1;                        R[lx] = rx;                    }                    num = 1;                }            }            for(long long i = 1; i <= n; i++){                if(L[i] != 0 && R[i] != 0) {                    long long m1 = i - L[i];                    long long m2 = R[i] - i;                    ans += m1 * m2;                }            }        }        printf("%I64d\n", ans);//        cout << ans << endl;    }    return 0;}


0 0