Pagini recente » Cod sursa (job #3272910) | Cod sursa (job #3276101) | Cod sursa (job #2399127) | Cod sursa (job #3257762) | Cod sursa (job #466179)
Cod sursa(job #466179)
#include <cstdio>
#include <cassert>
#include <algorithm>
#include <vector>
using namespace std;
#define MAXN 100000
#define MAXV 100000
int N, x[MAXN], v[MAXN];
int p[MAXN];
int main() {
freopen("numarare.in", "rt", stdin);
#ifndef DEBUG
freopen("numarare.out", "wt", stdout);
#endif
assert(scanf("%d", &N) == 1);
assert(1 <= N && N <= MAXN);
int MIN = 0x3f3f3f3f, MAX = -0x3f3f3f3f;
for (int i = 0; i < N; i++) {
assert(scanf("%d", x + i) == 1);
assert(x[i] <= MAXV);
MIN = min(MIN, x[i]);
MAX = max(MAX, x[i]);
v[i] = x[i] - x[i - 1];
}
int last = -1, lastBegin = -1;
for (int i = 1; i < N; i++) {
if (last >= i) {
p[i] = min(p[lastBegin + (last - i)], (last - i) * 2 + 1);
}
int l = i - ((p[i] + 1) / 2), r = i + ((p[i] + 1) / 2);
for (; l >= 1 && r < N && v[l] == v[r]; l--, r++) {
p[i] += 1 + (l != r);
}
l++; r--;
if (r >= last) {
last = r;
lastBegin = l;
}
}
// TODO: long long
int NR = 0;
for (int i = 1; i < N; i++) {
NR += p[i] / 2 + 1;
}
printf("%d\n", NR);
return 0;
}