• CF1313C2 Skyscrapers (hard version)


    思路:

    使用单调栈。

    实现:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int N = 500005;
     5 ll a[N], l[N], r[N];
     6 int main()
     7 {
     8     int n;
     9     while (cin >> n)
    10     {
    11         stack<int> st;
    12         for (int i = 1; i <= n; i++) cin >> a[i];
    13         for (int i = 1; i <= n; i++)
    14         {
    15             while (!st.empty() && a[st.top()] >= a[i]) st.pop();
    16             if (st.empty()) l[i] = i * a[i];
    17             else l[i] = l[st.top()] + (i - st.top()) * a[i];
    18             st.push(i);
    19         }
    20         while (!st.empty()) st.pop();
    21         for (int i = n; i >= 1; i--)
    22         {
    23             while (!st.empty() && a[st.top()] >= a[i]) st.pop();
    24             if (st.empty()) r[i] = (n - i + 1) * a[i];
    25             else r[i] = r[st.top()] + (st.top() - i) * a[i];
    26             st.push(i);
    27         }
    28         ll res = 0, id = 0;
    29         for (int i = 1; i <= n; i++)
    30         {
    31             ll tmp = l[i] + r[i] - a[i];
    32             if (tmp > res) { res = tmp; id = i; }
    33         }
    34         for (int i = id - 1; i >= 1; i--) a[i] = min(a[i], a[i + 1]);
    35         for (int i = id + 1; i <= n; i++) a[i] = min(a[i], a[i - 1]);
    36         for (int i = 1; i <= n; i++) cout << a[i] << " ";
    37         cout << endl;
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    SQL-Duplicate Emails
    c#创建可比较对象
    c#扩展方法
    C#Lambda和委托
    C#集合
    c#显示实现接口和隐式实现的区别
    bs同时上传文件以及文件信息
    sql查询数据库中所有 ,数据为空的表
    sql查询所有表名和描述
    MES数据采集模块小结
  • 原文地址:https://www.cnblogs.com/wangyiming/p/12355937.html
Copyright © 2020-2023  润新知