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.
浙公网安备 33010602011771号