题目描述
N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。
写一个程序计算出有多少对人可以互相看见。
输入输出格式
输入格式:
输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。
接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。
输出格式:
输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。
/*基础的n-1对,然后用栈维护大小,保证大前小后,若不满足*/ /*把比当前数小的数弹出来,加上它们的数量*//*然而这是错的*/ /*正解也是栈,但是处理方式不同*/ /*当一个身高比栈顶高的人要进栈时,先将栈中所有身高比他矮的人弹掉*/ /*对于一样高的要特殊考虑,他们不会阻碍视线,因此弹出去后要再加上*/ #include<cstdio> #include<algorithm> #define maxn 500001 using namespace std; int stack[maxn]; int top=0; int read() { int now=0; int f=1; char c=getchar(); while(c>'9'||c<'0') { if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9') { now*=10; now+=c-'0'; c=getchar(); } return now*f; } int main() { int n=read(); int tot=0; for(int i=1;i<=n;i++) { int op=read(); int co=1; while(op>stack[top]&&top>0) { top--; tot++; } while(op==stack[top]&&top>0) { top--; tot++; co++; } if(top!=0)tot++; top+=co; stack[top]=op; } printf("%d",tot); return 0; }