标签:amp flag 处理 因此 高度 不能 完全 连续 统计
// 找出以第i个栅栏高度为基准向左向右延伸的长度
// 维护单调递增的栈,这个是向右的
head = 0, tail = -1;
for (int i = 1; i <= n + 1; ++i) { // 多一个元素,可以让所有的都出栈
while (head <= tail && h[i] < h[que[tail]]) {
r[que[tail]] = i - que[tail];
--tail;
}
que[++tail] = i;
}
// 统计哪些不能刷完,就是左右延伸的宽度小于m
for (int i = 1; i <= n; ++i) {
if (l[i] + r[i] - 1 >= m) flag[i] = true; // 可以刷完
}
// 统计每个楼能刷的最大高度,左边跟我一起画个龙
for (int i = 1; i <= n; ++i) {
if (flag[i]) mh[i] = h[i];
else { // 如果i刷不完,那么它左边能刷到的高度一定小于i的高度,否则肯定能刷完i
mh[i] = mh[i-1];
}
}
// 右边再画一道彩虹
for (int i = n; i > 0; --i) {
if (!flag[i]) { // 如果i刷不完,那么它左边能刷到的高度一定小于i的高度,否则肯定能刷完i
mh[i] = max(mh[i], mh[i+1]);
}
sum -= mh[i];
}
// 刷的次数贪心搞,因为每个都要刷到最高,每次都贪心刷最宽就行了
int k = 2, ans = 0;
while (k <= n + 1) { // 多循环一次,保证所有的都在一个循环里刷完
int cnt = 1;
while (k <= n + 1 && mh[k] == mh[k-1]) {
++cnt;
++k;
}
ans += cnt / m;
if (cnt % m) ++ans;
++k;
}
标签:amp flag 处理 因此 高度 不能 完全 连续 统计
原文地址:https://www.cnblogs.com/kuangbiaopilihu/p/13218434.html