标签:
http://acm.hdu.edu.cn/showproblem.php?pid=5400
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1151 Accepted Submission(s): 501
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<algorithm> #define N 100010 using namespace std; long long a[N], al[N], ar[N];//al[i]表示从左边开始(以d1为公差的等差数列)记录元素的个数,ar[i]表示从右边开始(以d2为公差的等差数列)记录元素的个数 int main() { long long n, d1, d2, i; while(~scanf("%lld%lld%lld", &n, &d1, &d2)) { for(i = 1 ; i <= n ; i++) scanf("%lld", &a[i]); al[1] = ar[n] = 1;//初始化,最开始从左边开始i=1和从右边开始i=n时等差数列中的元素个数都为1 for(i = 2 ; i <= n ; i++) { if(a[i] == a[i - 1] + d1) al[i] = al[i - 1] + 1;//如果满足条件即a[i]是以d1为公差的等差数列里的元素,所以元素个数在本来的基础上+1 else al[i] = 1;//不满足条件则a[i]不是以d1为公差的等差数列里的元素,此时a[i]是另一个数列。其元素个数为1 } for(i = n - 1; i >= 1 ; i--) { if(a[i] == a[i + 1] - d2)//由a[i+1]=a[i]+d2转化而来 ar[i] = ar[i + 1] + 1; else ar[i] = 1; } long long ans = 0; for(i = 1 ; i <= n ; i++) { if(d1 == d2) ans += al[i]; else ans += al[i] * ar[i]; } printf("%lld\n", ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/qq2424260747/p/4801524.html