使用单调栈算法。
对于第 i 个建筑,高度为 hi,它向右看的安全视野距离规则是:
如果右侧存在第一个高度严格大于 hi 的建筑,则距离为这两个建筑的下标差; 如果右侧不存在更高的建筑,则距离为右侧剩余建筑数量,即 n−1−i。
在城市规划中,建筑师需要分析建筑物之间的视野关系。给出一条街道上的一排建筑物,每个建筑物有一定的高度。对于每个建筑物,我们定义一个安全视野距离:从该建筑物向右看,能看到的建筑物的数量。
一个建筑物 A 能够看到另一个建筑物 B 的条件是:
时间限制:C/C++ 1000ms,其他语言:2000ms
内存限制:C/C++ 256MB,其他语言:512MB
第一行:一个整数 n(1≤n≤5000000),表示建筑物的数量
第二行:n 个整数 h1,h2,...,hn(1≤hi≤1000),表示每个建筑物的高度
输出 n 个整数,用空格分隔,表示每个建筑物的安全视野距离
输入:
5
3 1 4 2 5
输出:
2 1 2 1 0
解释:建筑物 0(高度 3):看到建筑物 1(高度 1),建筑物 2(高度 4),4>3 被遮挡,看不到后面的高度为 2 和 5 的建筑物,视野距离 =2
建筑物 1(高度 1):看到建筑物 2(高度 4),4>1 被遮挡,视野距离 =1
建筑物 2(高度 4):看到建筑物 3(高度 2),看到建筑物 4(高度 5),5>4 被遮挡,视野距离 =2
建筑物 3(高度 2):看到建筑物 4(高度 5),5>2 被遮挡,视野距离 =1
建筑物 4(高度 5):右边没有建筑物,视野距离 =0
输入:
6
6 5 5 4 3 2
输出:
5 4 3 2 1 0
解释:相同高度的建筑物不遮挡