题意:计算连续的块的最大面积
开始没看清数据范围,直接暴力很自然的TLE了。。。
#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<cmath>
#define N 1000009
using namespace std;
__int64 a[N];
__int64 dp[100009];//前i个位置的最大面积
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0)break;
memset(a,0,sizeof a);
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
__int64 t=1;
for(int j=i-1;j>=1;j--)
if(a[j]>=a[i])t++;
else break;
for(int j=i+1;j<=n;j++)
if(a[j]>=a[i])
t++;
else break;
dp[i]=a[i]*t;
}
__int64 ans=0;
for(int i=1;i<=n;i++)
//cout<<dp[i]<<" ";
ans=max(ans,dp[i]);
printf("%I64d\n",ans);
}
return 0;
}
看了下别人代码,记录左边和右边满足条件的位置,然后求出左右距离就可以求出面积
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#define LL long long
#define maxn 100010
using namespace std;
LL a[maxn],dp[maxn];
LL le[maxn],ri[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0)break;
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
le[1]=1;ri[n]=n;
for(int i=2;i<=n;i++)
{
int tt=i;
while(tt>1&&a[i]<=a[tt-1]) tt=le[tt-1];
le[i]=tt;
}
for(int i=n-1;i>=1;i--)
{
int tt=i;
while(tt<n&&a[i]<=a[tt+1]) tt=ri[tt+1];
ri[i]=tt;
}
LL ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,(ri[i]-le[i]+1)*a[i]);
}
printf("%I64d\n",ans);
}
return 0;
}