ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[单调栈] GYM-103185E Excellent Views

2022-08-28 14:00:51  阅读:148  来源: 互联网

标签:ch 入栈 Views -- GYM 103185E mid ans 单调


题目大意

有 \(N (N\leq 10^5)\) 个建筑排成一列,第 \(i\) 个建筑的高度是 \(H_i\),\(H_i\) 两两不同,从建筑 \(i\) 到建筑 \(j\) 被认为是可达的,当且仅当不存在 \(k\) 使得 \(|i-k|\leq|i-j|\) 并且 \(H_j<H_k\)。

题解

考虑算每个 \(H_i\) 带来的贡献。维护一个从栈底到栈顶单调递减的单调栈,从左到右扫描 \(H_i\),将 \(H_i\) 入栈。在入栈时算新入栈的 \(H_i\) 对左边的贡献,出栈时对弹出的 \(H_j\) 算 \(H_j\) 对其右边带来的贡献。假设将小于 \(H_i\) 的元素都出栈后,当前栈顶是 \(H_j\),因为 \(H_j>H_i\),所以 \(H_i\) 会对 \([j+1,i-1]\) 的右半区间的位置都带来 \(1\) 的贡献。假设当前为了入栈 \(H_i\),弹出了 \(H_j\),因为 \(H_j<H_i\),所以 \(H_j\) 会对 \([j+1,i-1]\) 的左半段区间都带来 \(1\) 的贡献。注意考虑一下边界情况。区间加用差分维护即可,时间复杂度 \(O(n)\)。

Code

#include <bits/stdc++.h>
using namespace std;

#define LL long long

template<typename elemType>
inline void Read(elemType& T) {
    elemType X = 0, w = 0; char ch = 0;
    while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
    while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
    T = (w ? -X : X);
}

int a[100010], s[100010], ans[100010];
int n;

int main() {
    Read(n);
    for (int i = 1; i <= n; ++i)
        Read(a[i]);
    int top = 0;
    s[++top] = 1;
    for (int i = 2; i <= n; ++i) {
        while (top && a[s[top]] <= a[i]) {
            int L = s[top] + 1, R = i - 1;
            if (L <= R) {
                int mid = (L + R) >> 1;
                if ((R - L + 1) % 2 == 1) { ++ans[L]; --ans[mid]; }
                else { ++ans[L]; --ans[mid + 1]; }
            }
            --top;
        }
        int L = s[top] + 1, R = i - 1;
        int mid = (L + R) >> 1;
        if (L <= R) {
            if (!top) { ++ans[L]; --ans[R + 1]; }
            else { ++ans[mid + 1]; --ans[R + 1]; }
        }
        s[++top] = i;
    }
    while (top) {
        int L = s[top] + 1, R = n;
        if (L <= R) { ++ans[L]; --ans[R + 1]; }
        --top;
    }
    for (int i = 1; i <= n; ++i)
        ans[i] += ans[i - 1];
    for (int i = 1; i <= n; ++i)
        printf("%d ", ans[i]);
    printf("\n");

    return 0;
}

标签:ch,入栈,Views,--,GYM,103185E,mid,ans,单调
来源: https://www.cnblogs.com/AEMShana/p/16632659.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有