社区讨论

警示后人

P5019[NOIP 2018 提高组] 铺设道路参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhji1nqu
此快照首次捕获于
2025/11/04 02:54
4 个月前
此快照最后确认于
2025/11/04 02:54
4 个月前
查看原帖
其实这题一个O(n)贪心就可以了,大家不需要像我这样写一个看起来高级,但时间复杂度更高的代码
CPP
void merge(int l, int r)
{
	if (l > r) return ;
	if (l == r)
	{
		ans += a[l] - tag;
		return ;
	}
	int mid = (l + r) / 2;
	int minn = 1e9, pos = 0;
	bool flag = true;
	bool flag2 = true;
	for (int i = l; i <= r; i++)
	{
		if (a[i] - tag < minn)
		{
			minn = a[i] - tag;
			pos = i;
		}
		else if (a[i] - tag == minn)
		{
			if (abs(mid - pos) > abs(mid - i)) pos = i;
		}
		if (i == l) continue;
		if (a[i] < a[i - 1]) flag = false;
		if (a[i] > a[i - 1]) flag2 = false;
	}
	if (flag)
	{
		ans += a[r] - tag;
		return ;
	}
	if (flag2)
	{
		ans += a[l] - tag;
		return ;
	}
	ans += minn;
	tag += minn;
	merge(l, pos - 1), merge(pos + 1, r);
	tag -= minn;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...