标签:
题意:
n个数,两个公差d1, d2
求符合要求的子序列 [l, r](1≤l≤r≤n) 数量
要求:存在点i(l <= i <= r)使得a[l] ~a[i]是公差为d1的等差数列,a[i]~a[r]是公差为d2的等差数列
思路:枚举每个点,算出每个点向左向右符合条件的数有几个(自己本身算一个)记为 l[i] 和 r[i]
l[i] * r[i] 就是以i点为分割点符合条件的子序列个数
代码如下:
#include<cstdio> #include<cstring> #include<string> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N = 1e5+10; int n, d1, d2; ll a[N], l[N], r[N]; ll ans, cnt; int main() { int i, j, k; while(~scanf("%d%d%d", &n, &d1, &d2)) { for(i = 1; i <= n; i++) { scanf("%I64d", &a[i]); } if(d1 == d2) { for(int i = 1; i <= n; i++) l[i] = 1; } else { l[1] = 1; for(int i = 2; i <= n; i++) { if((a[i] - a[i-1]) == d1) { l[i] = l[i-1] + 1; } else l[i] = 1; } } ans = 0; r[n] = 1; ans += l[n] * r[n]; for(int i = n - 1; i > 0; i--) { if((a[i+1] - a[i]) == d2) { r[i] = r[i+1] + 1; } else r[i] = 1; ans += l[i] * r[i]; } printf("%I64d\n", ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/doris1104/article/details/47779213