社区讨论

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 条回复,欢迎继续交流。

正在加载回复...