hdu5400

来源:互联网 发布:手机qq数据迁移 编辑:程序博客网 时间:2024/05/03 11:05

大水题,但wa了几次。。。

思路:用一个数组保存相邻两数的差,然后过一遍数组,连续的b2可以,连续的b1之后再连续的b2也可以.。这题的个数用longlong,这个注意到了,我用len表示来连续的个数,sum+=(len+1)*len/2;我len用int保存,这里int会爆掉。。。逗比错误啊

#include <iostream>#include<cstring>#include<stdio.h>using namespace std;const int M=1e5+20;typedef long long ll;int a[M],b[M];int main(){    int n,b1,b2;    while(~scanf("%d",&n))    {        int i,j;        scanf("%d%d",&b1,&b2);        scanf("%d",&a[0]);        for(i=1;i<n;i++)        {            scanf("%d",&a[i]);            b[i-1]=a[i]-a[i-1];        }        i=0;        ll sum=n;        ll len=0;        //把没有价值的数去掉        while(i<n-1&&b[i]!=b1&&b[i]!=b2)                i++;        while(i<n-1)        {            if(b[i]==b2)            {                while(i<n-1&&b[i]==b2)                {                    i++;                    len++;                }                sum+=len*(len+1)/2;                while(i<n-1&&b[i]!=b1&&b[i]!=b2)                    i++;                len=0;            }            if(i==n-1)                break;            if(b[i]==b1)            {                while(i<n-1&&b[i]==b1)                {                    i++;                    len++;                }                if(i==n-1)                {                    sum+=(len+1)*len/2;                    break;                }                if(b[i]==b2)                {                    while(i<n-1&&b[i]==b2)                    {                        i++;                        len++;                    }                }                    sum+=len*(len+1)/2;                while(i<n-1&&b[i]!=b1&&b[i]!=b2)                    i++;                len=0;            }        }        cout<<sum<<endl;    }    return 0;}

0 0