我是个蒟蒻,O(n)的做法我不会。
但是,请看好数据。10000x5000是**不会**超时的!!!!!
所以我就用了10000x5000的大暴力
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[10010];
int mx=-1;//判断最大高度
for(int i=1;i<=n;i++)
{
cin>>a[i];
mx=max(a[i],mx);
}
int sum=0;
int l,r;
for(int h=1;h<=mx;h++)//每一层枚举
{
for(int j=2;j<=n-1;j++)
{
if (a[j]!=0)
{
l=j;
break;
}
}
for(int j=n-1;j>=2;j--)
{
if (a[j]!=0)
{
r=j;
break;
}
}
//l,r找一个区间,用于去掉前,后的0,因为前,后的0是不会积水的,只有中间的会
for(int j=l;j<=r;j++)//所以要在l~r之间找0
{
if (a[j]==0)
{
sum++;
}
}
for(int j=2;j<=n-1;j++)
{
if (a[j]!=0)
{
a[j]--;
}
}
//高度减少,然后就只剩下一层
}
cout<<sum<<endl;
exit(0);
}