#include<bits/stdc++.h>
using namespace std;
int a[100000],n,n1,a1[100000];
int res[110],res1[110];
int main()
{
cin>>n;
stack<int> c;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=n;i>=1;i--){
while(!c.empty()&&a[c.top()]>=a[i])c.pop();
if(c.empty())res[i]=n+1;//如果不存在,则下标为n+1
else res[i]=c.top();
c.push(i);
}
for(int i=1;i<=n;i++)cout<<res[i]<<" ";//输出自己右边第一个比自己小的元素的下标
return 0;
}
//求解一个数组中某一位置对应元素向左遍历第一个比自己小的值的位置
#include<bits/stdc++.h>
using namespace std;
int a[]={4,3,6,7,8,4,2,9};
int res[110];
nt main()
{
stack<int> c;
for(int i=0;i<8;i++){
while(!c.empty()&&a[c.top()]>=a[i])c.pop();
if(c.empty())res[i]=0;
else res[i]=c.top();
c.push(i);
}
for(int i=0;i<8;i++)cout<<res[i]<<" ";
return 0;
}
poj2559 Largest Rectangle in a Histogram
求包含的最大面积,维护两个单调队列,队列求第一个比i大(小)的数
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define MAX 1000005
int deq[MAX];
long long L[MAX],R[MAX];
long long h[MAX];
int n;
int main()
{
while(~scanf("%d",&n)){
memset(h,-1,sizeof(h));
for(int i=1;i<=n;i++)
scanf("%lld",&h[i]);
memset(deq,0,sizeof(deq));
int head=0,tail=0;
deq[tail++]=0;
for(int i=1;i<=n;i++)
{
while(head<tail&&h[deq[tail-1]]>=h[i])tail--;
L[i]=deq[tail-1]+1;
deq[tail++]=i;
}
memset(deq,0,sizeof(deq));
deq[tail++]=n+1;
for(int i=n;i>0;i--)
{
while(head<tail&&h[deq[tail-1]]>=h[i])tail--;
R[i]=deq[tail-1]-1;
deq[tail++]=i;
}
long long res=0;
for(int i=1;i<=n;i++)
{
cout<<"r["<<i<<"]="<<R[i]<<endl;
cout<<"l["<<i<<"]="<<L[i]<<endl;
res=max(res,h[i]*(R[i]-L[i]+1));
}
printf("%lld\n",res);
}
}