HDU 5400

来源:互联网 发布:淘宝电动车专卖店 编辑:程序博客网 时间:2024/06/05 07:11

题意:问你[1 ,n]之间有多少个连续区间[l,r] 满足存在一个l<=j<=r,当l<j<i,这部分输数字以d2为等差区间

i<=j<r.这部分数字以d2为等差区间

那么一组数字中只有的区间只有以d1和d2、或者d1、或者d2、或者 没有d1和d2(本身)这几种情况。

有可能两部分的一个点重合。

然后这个区间的种数就是(长度+1)*长度/2;

#include<stdio.h>#include<string.h>const int N=1e5+10;int main(){    int n,d1,d2,a[N],vis[N],vis2[N];    while(scanf("%d%d%d",&n,&d1,&d2)!=EOF)    {        for(int i=1; i<=n; i++)            scanf("%d",&a[i]);        memset(vis,0,sizeof(vis));        memset(vis2,0,sizeof(vis2));        for(int i=1; i<n; i++)        {            if(a[i]+d1==a[i+1])vis[i]=1;            if(a[i]+d2==a[i+1])vis2[i]=1;        }//        for(int i=1; i<=n; i++)//            printf("%d ",vis[i]);//        puts("");//        for(int i=1; i<=n; i++)//            printf("%d ",vis2[i]);//        puts("");        // puts("ASJD");        long long sum=n;        for(int i=1; i<=n; i++)        {            int cnt=1;            if(vis[i]==1)            {                int t=-1;                for(int j=i; j<=n; j++)                    if(vis[j]==1)                    {                        cnt++;                        vis2[j]=0;                    }                    else                    {                        t=j;                        break;                    }                i+=cnt-1;                //printf("!!i %d\n",i,cnt);                if(t!=-1)                    for(int j=t; j<=n; j++)                        if(vis2[j]==1)                        {                            cnt++;                            vis2[j]=0;                        }                        else                        {                            break;                        }                cnt-=1;                //printf("%d\n",cnt);                sum+=(long long)(1+cnt)*cnt/2;            }        }        //printf("%d\n",sum);//        for(int i=1; i<=n; i++)//        {//            printf("%d ",vis2[i]);//        }        for(int i=1; i<=n; i++)        {            int cnt=1;            if(vis2[i]==1)            {                for(int j=i; j<=n; j++)                    if(vis2[j]==1)                        cnt++;                    else                        break;                cnt-=1;                i+=cnt;                sum+=(long long)(1+cnt)*cnt/2;            }        }        printf("%lld\n",sum);    }    return 0;}/*5 0 01 1 1 1 18 4 21 -1 -1 -1 8 8 4 68 2 -22 3 6 8 6 4 4 02 5 85 15 2 -22 4 2 4 28 1 -11 2 3 2 1 2 4 58 1 -13 2 1 2 3 2 1 25 1 -11 2 3 2 1*/


0 0