社区讨论
30分求调
P9485「LAOI-1」积水参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mkb8qrrh
- 此快照首次捕获于
- 2026/01/12 22:11 上个月
- 此快照最后确认于
- 2026/01/16 21:10 上个月
CPP
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 1e6 + 5;
const LL INF = 0x3f3f3f3f3f3f3f3f;
LL n, a[N];
LL lmx[N], rmx[N], dep[N];
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
int _;
cin >> _;
while (_--) {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
lmx[1] = a[1];
for (int i = 2; i <= n; i++) {
lmx[i] = max(lmx[i - 1], a[i]);
}
rmx[n] = a[n];
for (int i = n - 1; i > 0; i--) {
rmx[i] = max(rmx[i + 1], a[i]);
}
LL sum = 0;
for (int i = 1; i <= n; i++) {
dep[i] = min(lmx[i], rmx[i]) - a[i]; //cout<<dep[i]<<' ';
sum += dep[i];
}
LL ans = INF;
// 把i改成很大的数
for (int i = 1; i <= n; i++) {
ans = min(ans, sum - dep[i]);
}
// 如果a[i] == lmx[i],把i改成lmx[i - 1]
LL drop = 0, gap = 0; // 当前漏走多少水,要漏水至少要有多高
for (int i = 1; i <= n; i++) {
if (a[i] == lmx[i]) { // 作为开始漏水的起点
ans = min(ans, sum - drop);
drop = 0;
gap = lmx[i - 1];
// gap = i == 1 ? a[2] : lmx[i - 1];
} else {
if (gap < a[i]) {
gap = a[i];
}
drop += a[i] + dep[i] - gap;
}
}
drop = 0, gap = 0;
for (int i = n; i > 0; i--) {
if (a[i] == rmx[i]) {
ans = min(ans, sum - drop);
drop = 0;
gap = rmx[i + 1];
// gap = i == n ? a[n - 1] : rmx[i + 1];
} else {
if (gap < a[i]) {
gap = a[i];
}
drop += a[i] + dep[i] - gap;
}
}
cout << ans << '\n';
}
return 0;
}
提交记录
是按照第一篇题解的思路写的,但是实现不一样,不理解为什么错了
回复
共 0 条回复,欢迎继续交流。
正在加载回复...