题目
分析
这道题和04147:玉蟾宫一样,都要用到单调栈。不过,在解题时,需要打开思路:题目要求的每头牛能看到的牛的总数,而这会导致\(O(N^2)\)的遍历。另外一种思路是:改为计算每头牛能被几头牛看到。
因为牛只能往右看,所以某一头牛只能被其左边的牛看到。如果它左边的牛高度不如这头牛,那么这个向左“拓展”就停了。所以,我们只要维护左边“比我高”的牛,这是一个单调递减栈:我们在栈底保留的一定是最高的牛。
核心思路是:
flowchart TD
A[开始] -->B[初始化,数据读入等]
B --> D[从右到左遍历牛群 i=n-1到0]
D --> E{i >= 0?}
E -->|是| F[处理当前牛i]
E -->|否| M[输出total并结束]
F --> G["弹出栈中所有高度<=当前牛的牛"]
G --> H{栈为空?}
H -->|是| I["total += (n-1-i)\n能看到右边所有牛"]
H -->|否| J["total += (st.top()-i-1)\n能看到部分牛"]
I --> K[当前牛入栈]
J --> K
K --> L[i--]
L --> E
**“弹出栈中所有高度<=当前牛的牛”是算法的核心。
同时,请注意“能看到的牛的数量”的计算,在栈空和不空的时候,是不一样的。
答案
思考
(略)