题解 | 山峰数组计数

山峰数组计数

https://www.nowcoder.com/practice/aac1989d183d4e6daf6ee2e1ca62b50c

#include <iostream>

using namespace std;

typedef long long ll;

int main() {
	int n;
	cin >> n;
	int tmp;
	ll* sum = new ll[n + 1];
	sum[0] = 0;
	for	(int i = 1; i <= n; i++) {
		cin >> tmp;
		sum[i] = tmp + sum[i - 1];
	}
	int left = 1, right;
	if (sum[n - 1] - sum[1] <= sum[1] || sum[n] - sum[n - 1] >= sum[n - 1] - sum[1]) {
		cout << 0 << endl;
	} else {
		int l = 3, r = n;
		while (r > l) {
			int mid = (r - l) / 2 + l;
			if (sum[mid - 1] - sum[left] > sum[n] - sum[mid - 1] && sum[mid - 1] - sum[left] > sum[left]) r = mid;
			else l = mid + 1;
		}
		right = r;
		ll ans = 0;
		while (right <= n) {
			while (right <= n && !(sum[right - 1] - sum[left] > sum[n] - sum[right - 1] && sum[right - 1] - sum[left] > sum[left])) {
				right++;
			}
			ans += max(n - right + 1, 0);
			left++;
		}
		cout << ans << endl;
	}
} 

全部评论

相关推荐

11-27 14:21
同济大学 Java
卢来猴祖:给了这薪资关键拿不了几个月就给你踹了呀
点赞 评论 收藏
分享
gelmanspar...:奖学金删掉,自我评价删掉,简历压缩一下,写一页
如果再来一次,你还会学机...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务