i128 cei(i128 x, int d){ if (d < 0) x = -x, d = -d; if (x >= 0) return (x + d - 1) / d; elsereturn x / d; }
i128 flr(i128 x, int d){ if (d < 0) x = -x, d = -d; if (x >= 0) return x / d; elsereturn (x - d + 1) / d; }
structSGT1 { int N; i128 mx[kMaxN * 4]; voidpushup(int x){ mx[x] = std::max(mx[x << 1], mx[x << 1 | 1]); } voidbuild(int n){ for (N = 1; N <= n + 1; N <<= 1) {} std::fill_n(mx, 2 * N, -2e18); for (int i = 1; i <= n; ++i) { if (d[i] > 0) mx[i + N] = cei(b[i] - (i - 1), d[i]); } for (int i = N - 1; i; --i) pushup(i); } voidupdate(int x, i128 v){ mx[x += N] = v; for (x >>= 1; x; x >>= 1) pushup(x); } i128 query(){ return mx[1]; } } sgt1;
structSGT2 { int N; i128 mi[kMaxN * 4]; voidpushup(int x){ mi[x] = std::min(mi[x << 1], mi[x << 1 | 1]); } voidbuild(int n){ for (N = 1; N <= n + 1; N <<= 1) {} std::fill_n(mi, 2 * N, 2e18); for (int i = 1; i <= n; ++i) { if (d[i] < 0) mi[i + N] = flr(b[i] - (i - 1), d[i]); } for (int i = N - 1; i; --i) pushup(i); } voidupdate(int x, i128 v){ mi[x += N] = v; for (x >>= 1; x; x >>= 1) pushup(x); } i128 query(){ return mi[1]; } } sgt2;
boolcheck1(int s){ i128 L = 0, R = s; for (int i = 1; i <= n; ++i) { b[i] = a[i] - (i128)(n - i) * s; int d = 2 * i - n - 1; if (d == 0) { if (b[i] > 0) R = -1; } elseif (d > 0) { L = std::max(L, cei(b[i], d)); } else { R = std::min(R, flr(b[i], d)); } } return L <= R; }
boolcheck2(int s){ static std::vector<int> vec[kMaxN]; for (int i = 1; i <= n; ++i) vec[i].clear(); for (int i = 1; i <= n; ++i) { b[i] = a[i] - (i128)(n - i) * s; d[i] = 2 * i - n - 1; if (d[i] > 0) { i128 mi, r = b[i] - flr(b[i], d[i]) * d[i]; if (r >= 1) mi = r - 1; else mi = d[i] - 1; for (int j = mi; j <= n; j += d[i]) { if (i - j >= 1) vec[i - j].emplace_back(i); if (i + j <= n) vec[i + j].emplace_back(i); if (i - j - 1 >= 1) vec[i - j - 1].emplace_back(i); if (i + j + 1 <= n) vec[i + j + 1].emplace_back(i); } } elseif (d[i] < 0) { int mi, r = -b[i] - flr(-b[i], -d[i]) * (-d[i]); mi = (-d[i] - r) % (-d[i]); for (int j = mi; j <= n; j -= d[i]) { if (i - j >= 1) vec[i - j].emplace_back(i); if (i + j <= n) vec[i + j].emplace_back(i); if (i - j + 1 >= 1) vec[i - j + 1].emplace_back(i); if (i + j - 1 <= n) vec[i + j - 1].emplace_back(i); } } } sgt1.build(n), sgt2.build(n); for (int i = 1; i <= n; ++i) { for (auto x : vec[i]) { if (d[x] > 0) sgt1.update(x, cei(b[x] - abs(x - i), d[x])); else sgt2.update(x, flr(b[x] - abs(x - i), d[x])); } i128 L = sgt1.query(), R = std::min<i128>(s, sgt2.query()); if (n % 2 == 1) { int mid = (n + 1) / 2; if (d[mid] == 0 && b[mid] - llabs(mid - i) > 0) R = -1; } if (L <= R) return1; } return0; }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i <= n; ++i) std::cin >> a[i]; int mx = *std::max_element(a + 1, a + 1 + n); if (!mx) returnvoid(std::cout << "0\n"); int L = -1, R = 2 * mx, res = 2 * mx; while (L + 1 < R) { int mid = (L + R) >> 1; if (check1(mid)) R = res = mid; else L = mid; } if (res >= 2 && check2(res - 2)) --res; std::cout << res << '\n'; }