【HDOJ 5400】Arithmetic Sequence

来源:互联网 发布:软件求职自我介绍 编辑:程序博客网 时间:2024/05/15 06:47

【HDOJ 5400】Arithmetic Sequence

给了两个公差d1 d2 求满足左半边公差d1 右半边公差d2的区间种数
某个或者两个公差可以不存在于区间内 但必须满足d1在d2之前

代码如下:

#include <iostream>#include <cstdio>#define ll long longusing namespace std;int b[100001];int main(){    int n,d1,d2,i;    ll ans,l,r;    while(~scanf("%d %d %d",&n,&d1,&d2))    {        l = r = ans = 0;        scanf("%d",&b[1]);        for(i = 2; i <= n; ++i)        {            scanf("%d",&b[i]);            if(i != 2 && (b[i-1] - b[i-2] == d2 && b[i] - b[i-1] != d2 )||(b[i] - b[i-1] != d1 && b[i] - b[i-1] != d2 && b[i-1] - b[i-2] == d1) )//当前差不为d2且前一组差为d2 或者前一组差为d1且当前差不为d1也不为d2 该段区间可累计进去 区间1~xsum和即为累计方案数            {                if((l+r)&1) ans += (l+r+1)/2*(l+r);                else ans += (l+r)/2*(l+r+1);                l = r = 0;            }            if(b[i] - b[i-1] == d1)  l++;            else if(b[i] - b[i-1] == d2) r++;        }        if((l+r)&1) ans += (l+r+1)/2*(l+r);        else ans += (l+r)/2*(l+r+1);        printf("%lld\n",ans+n);    }    return 0;}
0 0
原创粉丝点击