洛谷:P2866:Bad Hair Day S


洛谷:P2866:Bad Hair Day S

Table of Contents

题目

P2866:Bad Hair Day S

分析

这道题和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

**“弹出栈中所有高度<=当前牛的牛”是算法的核心。

同时,请注意“能看到的牛的数量”的计算,在栈空和不空的时候,是不一样的。

答案

Solution

思考

(略)

Previous Next