您的位置:首页 > 产品设计 > UI/UE

HDU5400 Arithmetic Sequence 数学题

2015-08-18 17:33 726 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5400

题目大意:定义(d1,d2)算术序列为:对于给定的序列b1,b2,...,bn,存在i使得bj+1=bj+d1( j∈[1,i) );bj+1=bj+d2(j∈[i,n)).现在给出d1,d2和一个序列a1,a2,...,an,找出有多少个区间[l,r]满足(d1,d2)算术序列。

分析:我们可以找出对于给定的序列,满足算术序列的所有最大子串的长度,然后对于每一个子串,找出他的所有子串即可。对于一个长度为n的序列,其所有非空子串的个数为n(n+1)/2(可以由挡板原理算出)。

实现代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=100011;
const int INF=1111;
int sub[MAXN];
long long ans;
int main()
{
int n,d1,d2,x,y;
int ld1,ld2;
while(~scanf("%d%d%d",&n,&d1,&d2))
{
ans=0;
scanf("%d",&y);
for(int i=1;i<n;i++)
{
x=y;
scanf("%d",&y);
sub[i]=y-x;
}
sub
=INF;
ld1=ld2 =0;
bool flag=true;
for(int i=1;i<=n;i++)
{
if(sub[i]==d1&&flag)
ld1++;
else if(sub[i]==d2)
{
ld2++;
flag=false;
}
else
{
//printf("%d %d\n",ld1,ld2);
ans+=((long long)(ld1+ld2))*(ld1+ld2+1)/2;
ld1=ld2=0;
flag=true;
if(sub[i]==d1) ld1++;
}
}
printf("%lld\n",ans+n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: