社区讨论
警示后人
P5019[NOIP 2018 提高组] 铺设道路参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhji1nqu
- 此快照首次捕获于
- 2025/11/04 02:54 4 个月前
- 此快照最后确认于
- 2025/11/04 02:54 4 个月前
其实这题一个O(n)贪心就可以了,大家不需要像我这样写一个看起来高级,但时间复杂度更高的代码
CPPvoid 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 条回复,欢迎继续交流。
正在加载回复...