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(可以由挡板原理算出)。
实现代码如下:
题目大意:定义(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; }
相关文章推荐
- UINavigation返回按钮修改标题
- iOS UITableView代理方法详解
- android.util.AndroidRuntimeException: requestFeature() must be called before adding content
- ZOJ 2319 Beatuiful People(单调递增序列的变形)
- UINavigationController
- 初始UI(UILabel、UIButton、UITextField)
- HDU 5400 Arithmetic Sequence
- HDU 5400 Arithmetic Sequence(数学)——多校练习9
- 多校第九场 1005 hdu 5400 Arithmetic Sequence ( dp)
- 40.UITableViewController和刷新
- Ubiquitous Religions(POJ_2524)
- 为 UIImageView 添加Tap手势
- 使用 Fluent API 配置/映射属性和类型
- Arithmetic Sequence
- 取消延迟执行函数 cancelPreviousPerformRequestsWithTarget
- Junit入门学习(2)---------------TestSuite使用
- UIViewController 推出另外一个半透明的UIViewController
- UIScrollView循环滚动图片
- 黑马程序员_GUI
- GPUImage 滤镜头文件