列表

详情


NC23619. 小A的柱状图

描述

柱状图是有一些宽度相等的矩形下端对齐以后横向排列的图形,但是小A的柱状图却不是一个规范的柱状图,它的每个矩形下端的宽度可以是不相同的一些整数,分别为,每个矩形的高度是,现在小A只想知道,在这个图形里面包含的最大矩形面积是多少。


输入描述

一行一个整数N,表示长方形的个数
接下来一行N个整数表示每个长方形的宽度
接下来一行N个整数表示每个长方形的高度

输出描述

一行一个整数,表示最大的矩形面积

示例1

输入:

7
1 1 1 1 1 1 1
2 1 4 5 1 3 3

输出:

8

说明:

样例如图所示,包含的最大矩形面积是8

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 220ms, 内存消耗: 23816K, 提交时间: 2019-04-14 19:23:33

#include<bits/stdc++.h>
#define MAXN 1000000
using namespace std;
typedef long long ll;
ll h[MAXN+5],w[MAXN+5];
ll pre[MAXN+5];
int main()
{
	ios::sync_with_stdio(false);
	ll N;
	cin>>N;
	for(int i=1;i<=N;++i){
		cin>>w[i];
		pre[i]=pre[i-1]+w[i];	
	} 
	for(int i=1;i<=N;++i) cin>>h[i];
	stack<int> sta;
	sta.push(0);
	ll ans=0;
	for(int i=1;i<=N+1;++i){
		while(h[i]<h[sta.top()]){
			ll ans1=h[sta.top()];
			sta.pop();
			ll ans2=pre[i-1]-pre[sta.top()];
			ans=max(ans,ans1*ans2);
		}
		sta.push(i);
	}
	cout<<ans<<endl;
}

C 解法, 执行用时: 181ms, 内存消耗: 15912K, 提交时间: 2022-08-04 13:37:08

#include<stdio.h>
long long q[1000005];
long long sum[1000005];
long long a[1000005];
int main()
{
	int i,j,k,l,n,m,p=0;
	long long max=-1;
	scanf("%d",&n);
	sum[0]=0;q[0]=0;a[0]=-1;a[n+1]=-1;
	for(i=1;i<=n;i++){
	scanf("%d",&k);sum[i]=sum[i-1]+k;}
	for(i=1;i<=n;i++)scanf("%lld",&a[i]);
	q[++p]=1;
	for(i=2;i<=n+1;i++)
	if(a[i]>=a[q[p]]){
		q[++p]=i;
	}
	else{
		while(a[q[p]]>a[i]){
			if(a[q[p]]*(sum[i-1]-sum[q[p-1]])>max)max=a[q[p]]*(sum[i-1]-sum[q[p-1]]);
			p--;
		}
		q[++p]=i;
	}
	printf("%lld",max);
}

C++11(clang++ 3.9) 解法, 执行用时: 692ms, 内存消耗: 15964K, 提交时间: 2019-04-14 14:12:38

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
typedef long long ll;


ll a[maxn],h[maxn];


int main()
{
	ll n,ans=0;
	cin>>n;
	for(int i=1; i<=n; i++)
	{
		cin>>a[i];
		a[i]+=a[i-1];
	}
	for(int i=1; i<=n; i++)
		cin>>h[i];
	stack <int> s;
	s.push(0);
	for(int i=1; i<=n; i++)
	{
		while(h[i]<h[s.top()])
		{
			int t1=s.top();
			s.pop();
			int t2=s.top();
			ans=max(ans,h[t1]*(a[i-1]-a[t2]));
		}
		s.push(i);
	}
	cout<<ans<<endl;
}

Python3 解法, 执行用时: 1693ms, 内存消耗: 173204K, 提交时间: 2022-08-05 12:09:23

n = int(input())
a = list(map(int,input().split()))
for i in range(n):
    a[i] += a[i - 1]
b = list(map(int,input().split()))
res,tt = 0,0
stk = [0] * 1000005
for i in range(n):
    while tt > 0 and b[stk[tt]] > b[i]:
        res = max(res,b[stk[tt]] * (a[i - 1] - a[stk[tt - 1]]))
        tt -= 1
    tt += 1
    stk[tt] = i
print (res)

上一题