您的位置:首页 > 其它

hdu5399(模拟)

2015-08-18 16:30 309 查看
题意:

在一个序列中找出连续的子序列,满足在这个子序列中从某一个位置开始,左侧是一公差是d1的等差序列,右侧是一个公差是d2的等差序列,问能找到多少个子序列。

思路:

模拟,不多说,贴队友的代码。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const long long maxn = 100005;
long long a[maxn];

long long L[maxn], R[maxn];
int main() {
long long n, d1, d2;
//    freopen("a.txt","r",stdin);
while(EOF != scanf("%I64d%I64d%I64d",&n, &d1, &d2)) {
for(long long i = 1; i <= n; i++) {
scanf("%I64d",&a[i]);
}
memset(L, 0, sizeof(L));
memset(R,0, sizeof(R));
a[0] = 100000000000;
a[++n] = 100000000000;
//        for(long long i = 0; i <= n; i++) {
//            printf("%I64d ", a[i]);
//        }puts("");
long long ans = n-1;
long long num = 1;
long long lx, rx = 1;
for(long long i = 2; i <= n; i++){
if(a[i] - a[i - 1] == d1) {
num++;
if(num == 2) {
lx = i - 1;
}
}
else {
if(num >= 2) {
long long x = num - 1;
ans += (x * (x + 1) / 2);
rx = i - 1;
L[rx] = lx;
}
num = 1;
}
}
if(d1 != d2) {
num = 1;
lx = 1;
rx = 1;
for(long long i = 2; i <= n; i++){
if(a[i] - a[i - 1] == d2) {
num++;
if(num == 2) {
lx = i - 1;
}
}
else {
if(num >= 2) {
long long x = num - 1;
ans += (x * (x + 1) / 2);
rx = i - 1;
R[lx] = rx;
}
num = 1;
}
}
for(long long i = 1; i <= n; i++){
if(L[i] != 0 && R[i] != 0) {
long long m1 = i - L[i];
long long m2 = R[i] - i;
ans += m1 * m2;
}
}
}
printf("%I64d\n", ans);
//        cout << ans << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: