P1823 音乐会的等待

题目描述

N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。

写一个程序计算出有多少对人可以互相看见。

输入输出格式

输入格式:
输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。

接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。

输出格式:
输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。

输入输出样例

输入样例#1:
7
2
4
1
2
2
5
1
输出样例#1:
10

维护一个不升的序列

program df;
var i,j,n,m,x,y,z,k,t:longint;
a,b,c,d:array[0..600000] of longint;
begin
readln(n);
for i:=1 to n do
readln(a[i]);
t:=0; c[t]:=0; z:=0;
for i:=1 to n do
begin
k:=t; //复制栈
while (k>0) and (a[i]>=a[c[k]]) do //当找到一个元素大于递减的栈的末尾
begin
inc(z); //构成一对的同时退栈
dec(k);
end;
if k>0 then inc(z); //栈内还有元素则还能构成一对
while (t>0) and (a[i]>a[c[t]]) do dec(t); //将小于当前元素的退栈
inc(t);
c[t]:=i;
end;
writeln(z);
end.

posted @ 2017-06-17 22:17  Gxyhqzt  阅读(102)  评论(0)    收藏  举报