chenfy27的刷题记录

导航

abc372D Buildings

N幢楼排成一行,第i号楼的高度为H[i]。对于每幢楼,右边有多少幢楼满足两楼之间的楼高都不超过右侧楼高?
1<=N<=2E5, 1<=H[i]<=N, H[i]!=Hj

分析:单调栈求出各幢楼左边最近的比它高的楼,对于j号楼,假设它左边最近的比它高的楼号为i,那么j对区间[i,j-1]中每个下标都有1的贡献,可以用差分来维护。

#include <bits/stdc++.h>
using i64 = long long;

void solve() {
    int N;
    std::cin >> N;
    std::vector<int> H(N + 2);
    for (int i = 1; i <= N; i++) {
        std::cin >> H[i];
    }

    std::vector<int> L(N + 2), s;
    for (int i = 1; i <= N; i++) {
        while (!s.empty() && H[s.back()] <= H[i]) {
            s.pop_back();
        }
        L[i] = s.empty() ? 0 : s.back();
        s.push_back(i);
    }

    std::vector<int> A(N + 2);
    for (int i = 1; i <= N; i++) {
		A[L[i]] += 1;
		A[i] -= 1;
    }
    std::partial_sum(A.begin(), A.end(), A.begin());
    for (int i = 1; i <= N; i++) {
    	std::cout << A[i] << " \n"[i == N];
    }
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

posted on 2024-10-07 17:28  chenfy27  阅读(24)  评论(0)    收藏  举报