在做这道题时,我使用了ceil函数向上取整,结果在锣鼓上提交时候有几个点总是显示输出了小数点(在本地运行和其他的测试点均没有输出小数点。结果我在ceil函数前面加了一个int类型的强制转化,就直接过了。现在比较迷惑,请求各位大佬指点一下是什么原因,跪谢
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 500010;
int n, a[maxn];
double sqt[maxn];
inline double calc(int i, int j) {
return 1.0 * a[j] + sqt[i - j];
}
int fr, ed;
struct node
{
int l, r;
int p;
}q[maxn];
inline void init()
{
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; ++i) sqt[i] = sqrt(i);
}
inline int find(int x)
{
int L = q[ed].l, R = q[ed].r + 1, mid;
while (L + 1< R)
{
mid = (L + R) / 2;
if (calc(mid, q[ed].p) >= calc(mid, x)) L = mid;
else R = mid;
}
return L;
}
inline void ins(int x)
{
while (fr <= ed && calc(q[ed].l, q[ed].p) < calc(q[ed].l, x)) --ed;
if (q[ed].l < x) q[ed].l = x;
if (fr <= ed)
{
q[ed].r = n;
int mid = find(x);
q[ed].r = mid;
if (mid < n) q[++ed].l = mid + 1, q[ed].r = n, q[ed].p = x;
}
else q[++ed].l = x, q[ed].r = n, q[ed].p = x;
}
double res[maxn];
double ans[maxn];
inline void solve1()
{
fr = 1, ed = 0;
for (int i = 1; i <= n; ++i)
{
ins(i);
while (q[fr].r < i) ++fr;
// cout<<q[fr].p<<" "<<q[fr].l<<" "<<q[fr].r<<endl;
res[i] = calc(i, q[fr].p) - a[i];
}
}
inline void solve2()
{
for (int i = 1; i <= ed; ++i) q[i].l = q[i].r = q[i].p = 0;
fr = 1, ed = 0;
for (int i = 1; i <= n; ++i)
{
ins(i);
while (q[fr].r < i) ++fr;
// cout<<q[fr].p<<" "<<q[fr].l<<" "<<q[fr].r<<endl;
ans[i] = calc(i, q[fr].p) - a[i];
}
}
int main()
{
// freopen("dp.in", "r", stdin);
init();
solve1();
for (int i = 1; i <= n / 2; ++i) swap(a[i], a[n - i + 1]);
solve2();
// for (int i = n; i >= 1; --i) cout<<ans[i]<<" ";
// cout<<endl;
// for (int i = 1; i <= n; ++i) cout<<res[i]<<" ";
// cout<<endl;
for (int i = 1; i <= n; ++i)
cout<<(int)ceil( max(res[i], ans[n - i + 1]) )<<endl; //就是这里
return 0;
}