输入地下排水通道宽度和长度,(单位:米)
第二行为通道内石块距离地面的长度。(单位:米)
输出为地下排水通道内的积水立方数
#include <iostream>
#include <vector>
#include <stack>
#include <cmath>
#include <algorithm>
using namespace std;
vector<int> data(10010);
// 接雨水算法,一模一样
int trap(vector<int>& height) {
stack<int> s;
int ans = 0;
for (int i = 0; i < height.size(); ++i) {
while (!s.empty() && height[s.top()] < height[i] ) {
int top = s.top();
s.pop();
if (s.empty()) break;
int dis = i - s.top() - 1;
int high = min(height[i], height[s.top()]) - height[top];
ans += dis * high;
}
s.push(i);
}
return ans;
}
int main() {
int W,L;
cin>>W>>L;
int maxnum = 0;
// data[0] = 5;
for(int i = 1; i<=L; i++) {
int x;
cin>>x;
data[i] = x;
maxnum = max(maxnum,x);
}
// 需要处理边界
data[0] = maxnum;
// 转换接雨水问题,距离地面高度变成平台高度
for(int i = 1; i<=L; i++) {
data[i] = maxnum - data[i];
}
cout<<trap(data)*W;
return 0;
}