题目链接:https://www.luogu.com.cn/problem/P5019
解题思路:
这道题目采用两种贪心思想都是可以解决的:
- 自底向上将一块块连通的位于同一层的填上;
- 从左到右将一段段最长的一段填上去。
这里基于第2种思想。
对染理论上来说 (n imes d le 10^9) 暴力可以过,但是我只拿了80分。
所以可以批量更新,也就是说如果是下面这一组数据:
2,6,6,6,6,2
那么我可以将将区间 ([2,4]) 范围批量+4,需要4步。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010, INF = (1<<29);
int n, d[maxn], dmax, ans;
void handle(int L, int R, int d1) {
if (L > R) return;
int i = L;
while (i <= R && d[i] == d1) i ++;
if (i > R) return;
int j = i;
while (j+1 <= R && d[j+1] > d1) j ++;
int d2 = INF;
for (int k = i; k <= j; k ++) d2 = min(d2, d[k]);
ans += d2 - d1;
handle(i, j, d2);
handle(j+1, R, d1);
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i ++) {
scanf("%d", d+i);
dmax = max(dmax, d[i]);
}
handle(1, n, 0);
printf("%d
", ans);
return 0;
}