维护一个单调栈,栈中元素单调递减。
同时记录一个num数组,表示的是栈中这个点能够看到的牛的数量+1(它本身)
插入元素a[i]时,一直dec(stack_size)直到stack[stack_size]>=a[i],同时temp记录扫过的num[i]之和,
在ans的值上加上temp值
如果stack[stack_size]=a[i],那么就在num[stack_size]上加上temp+1,否则将这个元素压入栈中。
最后的ans值就是答案
CODE
Program Badhair;//By_Thispoet
Const
maxn=80000;
Var
i,n,size,temp :Longint;
stack,a,num :Array[0..maxn]of Longint;
ans :Int64;
BEGIN
size:=0;
readln(n);
for i:=1 to n do readln(a[i]);
for i:=n downto 1 do
begin
temp:=0;
while (size>0)and(stack[size]<a[i])do
begin
inc(temp,num[size]);
dec(size);
end;
inc(ans,temp);
if stack[size]=a[i] then
begin
inc(temp,num[size]);
dec(size);
end;
inc(size);
num[size]:=temp+1;
stack[size]:=a[i];
end;
writeln(ans);
END.