[Python] P2866 [USACO06NOV] Bad Hair Day S

农夫约翰有 NN 头奶牛正在过乱头发节。

每一头牛都站在同一排面朝右,它们被从左到右依次编号为 1,2,,N1, 2, \cdots, N。编号为 ii 的牛身高为 hih_i。第 NN 头牛在最前面,而第 11 头牛在最后面。

对于第 ii 头牛前面的第 jj 头牛,如果 hi>hi+1,hi>hi+2,,hi>hjh_i>h_{i+1}, h_i>h_{i+2}, \cdots, h_i>h_j,那么认为第 ii 头牛可以看到第 i+1i+1 到第 jj 头牛。

定义 CiC_i 为第 ii 头牛所能看到的牛的数量。请帮助农夫约翰求出 C1+C2++CNC _ 1 + C _ 2 + \cdots + C _ N

输入格式

输入共 N+1N + 1 行。

第一行为一个整数 NN,代表牛的个数。
接下来 NN 行,每行一个整数 aia _ i,分别代表第 1,2,,N1, 2, \cdots, N 头牛的身高。

输出格式

输出共一行一个整数,代表 C1+C2++CNC _ 1 + C _ 2 + \cdots + C _ N

输入输出样例 #1

输入 #1

1
2
3
4
5
6
7
6
10
3
7
4
12
2

输出 #1

1
5

说明/提示

数据规模与约定

对于 100%100\% 的数据,保证 1N8×1041 \leq N \leq 8 \times 10 ^ 41hi1091 \leq h _ i \leq 10 ^ 9

题解

单调栈求最近较大位置

1
2
3
4
5
6
7
8
9
10
11
12
13
stack = []
ans = {}

n = int(input())
cows = [int(input()) for _ in range(n)]

for i, h in reversed(list(enumerate(cows))):
while stack and cows[stack[-1]] < h: stack.pop()
ans[i] = stack[-1] if stack else n
stack.append(i)

#print(ans)
print(sum(ans[i]-i-1 for i in range(n)))