求卡常
  • 板块灌水区
  • 楼主syr1125
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/1/7 10:24
  • 上次更新2024/1/7 13:21:27
查看原帖
求卡常
561949
syr1125楼主2024/1/7 10:24

直方图中的最大矩形,需要卡常。

#include <iostream>
#include <stack>
#define int long long
using namespace std;
int n, a[1000065], vis1[1000005], vis2[1000005];
stack<int> s;
signed main()
{
	while (1)
	{
		memset(a, 0, sizeof a);
		memset(vis1, 0, sizeof vis1);
		memset(vis2, 0, sizeof vis2);
		scanf("%lld", &n);
		if (n == 0) break;
		for (int i = 1; i <= n; i ++)
		{
			cin >> a[i];
		}
		for (int i = 1; i <= n; i ++)
		{
			while (!s.empty() && a[s.top()] > a[i])
			{
				vis1[s.top()] = i;
				s.pop();
			}
			s.push(i);
		}
		while (s.size()) s.pop();
		for (int i = n; i >= 1; i --)
		{
			while (!s.empty() && a[s.top()] > a[i])
			{
				vis2[s.top()] = i;
				s.pop();
			}
			s.push(i);
		}
		while (s.size()) s.pop();
		int maxn = 0;
		for (int i = 1; i <= n; i ++)
		{
			if (vis1[i] == 0) vis1[i] = n + 1;
			maxn = max(maxn, (vis1[i] - vis2[i] - 1) * a[i]);
		}
		cout << maxn << endl;
	}
	return 0;
}


只能用c++98(悲)

2024/1/7 10:24
加载中...