专栏文章

题解:P11963 [GESP202503 六级] 环线

P11963题解参与者 24已保存评论 27

文章操作

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

当前评论
27 条
当前快照
1 份
快照标识符
@mipttlv6
此快照首次捕获于
2025/12/03 17:50
3 个月前
此快照最后确认于
2025/12/03 17:50
3 个月前
查看原文
提供一个空间复杂度 O(1)O(1) 的做法。

解题思路

本题可以分为两种情况考虑
  • 跨环情况:看做从车站 11 坐到车站 xx,再从车站 xx 坐到车站 nn。也就是说 x+1x+1y1y-1 的部分是没有坐到的。我们想让坐到的部分最大化,就要让没坐到的部分最小化。求出原序列的最小子段和,再用总和减去即可。这一部分的空间复杂度可以做到 O(1)O(1)
  • 不跨环情况:相当于直接求最大子段和。这一部分的空间复杂度也是 O(1)O(1) 的。
将上面两种情况综合起来,也就是求它们的最小值,就能得到最终答案。
注意特判全是负数的情况,不然会得到 7070

AC 代码

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t, n, maxdp, mindp, sum, minn = LLONG_MAX, maxx = LLONG_MIN, maxn = LLONG_MIN;
signed main() {
	cin >> t;
	while (t--) {
		cin >> n;
		sum += n;
		maxn = max(maxn, n);
		maxdp = max(n, maxdp + n);
		maxx = max(maxdp, maxx);
		mindp = min(n, mindp + n);
		minn = min(mindp, minn);
	}
	if (maxn < 0) cout << maxn;
	else cout << max(sum - minn, maxx);
	return 0;
}

评论

27 条评论,欢迎与作者交流。

正在加载评论...