CF581B Luxurious Houses 题解

Content

一条大街上有 \(n\) 个房子,第 \(i\) 个房子的楼层数量是 \(h_i\)。如果一个房子的楼层数量大于位于其右侧的所有房屋,则房屋是豪华的。对于第 \(i\) 个房子,请求出至少要添加多少层才能使这个房子变得豪华。注意,对于所有的房子,其答案互不影响。

数据范围:\(1\leqslant n\leqslant 10^5,1\leqslant h_i\leqslant 10^9\)

Solution

我们可以由后往前求出从 \(i\)\(n\)\(h_i\) 最大值 \(s_i=\max\{s_{i+1},h_i\}\),然后再记录最大值有变化时的位置,最后很明显,这些房子都不需要盖楼了,否则对于第 \(i\) 个房子,需要盖的楼层数就是 \(s_i+1-a_i\)\(s_i\) 的含义上面有讲)。

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;

int n, a[100007], maxi[100007], effo[100007];

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	maxi[n] = a[n], effo[n] = n;
	for(int i = n - 1; i >= 1; --i) {
        if(a[i] > maxi[i + 1]) {
			maxi[i] = a[i];
			effo[i] = i;
		} else {
            maxi[i] = maxi[i + 1];
            effo[i] = effo[i + 1];
        }
    }
	for(int i = 1; i <= n; ++i) {
        if(effo[i] == i)    printf("0 ");
        else printf("%d ", maxi[i] + 1 - a[i]);
    }
    return 0;
}
posted @ 2021-12-17 14:15  Eason_AC  阅读(26)  评论(0)    收藏  举报