#include namespace { #pragma GCC diagnostic ignored "-Wunused-function" #include #pragma GCC diagnostic warning "-Wunused-function" using namespace std; using namespace atcoder; #define rep(i,n) for(int i = 0; i < (int)(n); i++) #define rrep(i,n) for(int i = (int)(n) - 1; i >= 0; i--) #define all(x) begin(x), end(x) #define rall(x) rbegin(x), rend(x) template bool chmax(T& a, const T& b) { if (a < b) { a = b; return true; } else return false; } template bool chmin(T& a, const T& b) { if (b < a) { a = b; return true; } else return false; } using ll = long long; using P = pair; using VI = vector; using VVI = vector; using VL = vector; using VVL = vector; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; VI a(n); rep(i, n) cin >> a[i]; VI b(2 * (n - 1)); rep(i, n - 1) b[i] = a[i+1] - a[i]; rep(i, n - 1) b[n-1+i] = -(a[n-1-(i+1)] - a[n-1-i]); VI sa = suffix_array(b); VI inv(2 * (n - 1)); rep(i, 2 * (n - 1)) inv[sa[i]] = i; VI lcp = lcp_array(b, sa); segtree seg(lcp); ll ans = 0; rep(i, n) { if (i == 0 || i == n - 1) { ans++; continue; } int p = inv[i], q = inv[n-1+n-1-i]; if (p > q) swap(p, q); int res = seg.prod(p, q) + 1; chmin(res, min(i + 1, n - i)); ans += res; } rep(i, n - 1) { if (i == 0 || i == n - 2) { ans++; continue; } int p = inv[i], q = inv[n-1+n-1-(i+1)]; if (p > q) swap(p, q); int res = seg.prod(p, q); chmin(res, min(i + 1, n - (i + 1))); ans += res; } cout << ans << '\n'; }