关于ceil函数
查看原帖
关于ceil函数
215590
Ckger楼主2024/7/27 09:29

在做这道题时,我使用了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;
}
2024/7/27 09:29
加载中...