如题
求大佬帮忙看看哪块还会出现精度问题,错的那几个点和其他大佬精度问题出错的点一样,而且都是比标准答案少 1
f128 : long double i32 : int i64 : long long
f128 calc(i32 j, i32 i) {
return a[j] - a[i] + sqrt(std::abs((f128)(i * 1.0 - j)));
}
i32 get_pos(const d& x, const i32& i) {
i32 l = x.l, r = x.r, mid;
while (l < r) {
mid = (l + r) >> 1;
if (calc(x.p, mid) <= calc(i, mid))
r = mid;
else
l = mid + 1;
}
return r;
}
void solve() {
q.push_back((d){ 1, n, 0 });
for (i32 i = 1; i <= n; ++i) {
if (q.size()) {
if (q.front().r == i - 1)
q.pop_front();
else
q.front().l = i;
}
p[i] = std::max(p[i], calc(q.front().p, i));
i32 pos = q.back().l;
while (q.size() && calc(q.back().p, q.front().l) <= calc(i, q.back().l)) {
pos = q.back().l;
q.pop_back();
}
if (q.empty())
q.push_back((d){ i + 1, n, i });
else {
if (calc(q.back().p, q.back().r) >= calc(i, q.back().r)) {
pos = q.back().r + 1;
} else {
pos = get_pos(q.back(), i);
}
if (pos <= n) {
q.back().r = pos - 1;
q.push_back((d){pos, n, i});
}
}
}
}
int main() {
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n;
for (i32 i = 1; i <= n; ++i)
cin >> a[i];
solve();
q.clear();
std::reverse(a + 1, a + n + 1);
std::reverse(p + 1, p + n + 1);
solve();
std::reverse(p + 1, p + n + 1);
for (i32 i = 1; i <= n; ++i)
cout << (i32)std::ceil(p[i]) << '\n';
return 0;
}