top1编程
← 返回题目
题解

【基础】人数清点

1 条题解

  • 0
    @ 2026-7-28 22:10:11
    #include <bits/stdc++.h>  
    using namespace std;  
    int n; // 高度的数量  
    long long h[80010], f[80010], r[80010]; 
    // h: 高度数组, f: 记录每个元素右侧比它小的元素数量, r: 记录右侧第一个比当前元素小的元素的索引  
    int main() {  
    	cin >> n; // 输入高度数量  
    	for (int i = 1; i <= n; i++) {  
    		cin >> h[i]; // 输入每个高度  
    	}  
    	
    	// 从后向前遍历高度数组  
    	for (int i = n; i > 0; i--) {  
    		int j = i + 1; // j 初始化为 i 的下一个元素  
    		// 找到右侧第一个比 h[i] 小的元素  
    		while (j < n + 1 && h[i] > h[j]) {  
    			j = r[j]; // 更新 j 为 r[j],继续查找  
    		}  
    		r[i] = j; // 记录第一个比 h[i] 小的元素的索引  
    		f[i] = j - i - 1; // 计算右侧比 h[i] 小的元素数量  
    	}  
    	
    	long long s = 0; 
    	for (int i = 1; i <= n; i++) {  
    		s += f[i]; // 累加所有 f[i] 的值  
    	}  
    	
    	cout << s << endl; 
    	return 0; 
    }
    
    • 1