题解
【基础】人数清点
1 条题解
-
0
#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