题目:
题意:
n个人站成一排,给出他们的身高,求有多少对人可以相互看见,即两人中间没有比他们高的。
分析:
防止重复计算,可以计算一个人可以被他左边的多少个人看到,因此如果一个人右边的人比他高,那么后面的人他就再也看不到了,也就是后面的计算就和他没什么关系了。因此可以维护一个单调栈,从左到右的人依次入栈,入栈时如果栈顶的人的身高比他矮,栈顶的人出栈,同时对数+1。数据范围比较大,因此入栈查找时可以使用二分查找。
代码:
#include<cstdio>
int n,i,top=0;
long long h,st[500010],s=0;
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%lld",&h);
int l=1,r=top,m;
while(l<r){
m=(l+r)>>1;
if(r==l+1) m=r;
if(h>=st[m]) r=m-1;
else l=m;
}
s+=top-l+1;
while(top&&h>st[top]) top--;
st[++top]=h;
}
printf("%lld",s);
return 0;
}