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 }
CF1313C2 Skyscrapers (hard version)的更多相关文章
- Codeforces Round #622(Div 2)C2. Skyscrapers (hard version)
题目链接 : C2. Skyscrapers (hard version) 题目描述 : 与上一道题类似,只是数据范围变大, 5e5, 如果用我们原来的方法,铁定是超时的. 考察点 : 单调栈,贪心, ...
- Codeforces Round #622(Div 2) C1. Skyscrapers (easy version)
题目链接: C1. Skyscrapers (easy version) 题目描述: 有一行数,使得整个序列满足 先递增在递减(或者只递增,或者只递减) ,每个位置上的数可以改变,但是最大不能超过原来 ...
- Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)(单调栈,递推)
Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version) 题意: 你是一名建筑工程师,现给出 n 幢建筑的预计建设高度,你想建成峰状, ...
- Codeforces Round #622 C2.Skyscrapers (hard version)
This is a harder version of the problem. In this version n≤500000n≤500000 The outskirts of the capit ...
- Codeforces Round #622 (Div. 2) C1. Skyscrapers (easy version)(简单版本暴力)
This is an easier version of the problem. In this version n≤1000n≤1000 The outskirts of the capital ...
- Codeforces Round #622 (Div. 2) C2 - Skyscrapers (hard version) 单调栈
从左往右扫,找到比第i个小的第一个数字,l[i] = l[last] + (i - last) * m[i],用单调栈O(n)维护这个过程,再从右往左扫,同理可以算出r数组,注意一下long long ...
- Codeforces Round #622 (Div. 2).C2 - Skyscrapers (hard version)
第二次写题解,请多多指教! http://codeforces.com/contest/1313/problem/C2 题目链接 不同于简单版本的暴力法,这个数据范围扩充到了五十万.所以考虑用单调栈的 ...
- C2 - Skyscrapers (hard version)
前几天做的题,当时好像是超时了,这个博客写的超好https://blog.csdn.net/lucky52529/article/details/89155694 用单调站解决问题. 代码是从另外一篇 ...
- X - Skyscrapers (hard version) CodeForces - 1313C2
题目大意:n个高楼,每个楼最高为mi,要求,第i个楼左边和右边不能有同时比它高的楼.让你求最在n个楼总和最高的情况下,每个楼的高度. 题解:用单调栈来做,n个楼的高度要么是单调递减,要么是单调递增,要 ...
随机推荐
- mac配置Android SDK
下载地址:http://tools.android-studio.org/index.php/sdk 2.找到tools文件夹 选中android-sdk-macosx包下的tools文件夹,按com ...
- linux硬盘分区和fdisk命令
分区的几个概念 硬盘分区有三种,主分区.扩展分区.逻辑分区.一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个.且主分区+扩展分区总共不能超过4个.逻辑分区可以有若干个.在windows下 ...
- 【RAC】通过命令查看当前数据库是不是rac
SQL> show parameter cluster_database 如果参数中显示的是 NAME TYPE ...
- ctfhub技能树—信息泄露—备份文件下载—网站源码
打开靶机 查看网页内容 使用dirsearch进行扫描 命令如下 python3 dirsearch.py -u http://challenge-91f1f5e6a791ab02.sandbox.c ...
- oracle dataguard搭建
搭建前环境准备 1.查看主库的oracle的uid和gid并在备库创建用户 # 主库查看oracle $ id oracle uid=54321(oracle) gid=54321(oinstall) ...
- 把vscode打造成技术写作神器
作为技术开发,大家平时肯定需要记录技术笔记.甚至有的同学还开通可自己的技术博客或者技术公众号进行创作. 这个时候有套趁手的写作工具尤为重要,节省下时间好好休息一下,对于咱们程序员来说更加重要.因为最近 ...
- 解决Python内CvCapture视频文件格式不支持问题
解决Python内CvCapture视频文件格式不支持问题 在读取视频文件调用默认的摄像头cv.VideoCapture(0)会出现下面的视频格式问题 CvCapture_MSMF::initStre ...
- 图像Demosaic算法及其matlab实现
由于成本和面积等因素的限定,CMOS/CCD在成像时,感光面阵列前通常会有CFA(color filter array),如下图所示,CFA过滤不同频段的光,因此,Sensor的输出的RAW数据信号包 ...
- winform 扫码识别二维码
因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能. 我根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好) 现在将调用摄像头+识别二 ...
- C#高级编程第11版 - 第八章 索引
[1]8.1 引用方法 1.委托是指向方法的.NET地址变量. 2.委托是类型安全的类,定义了返回类型和参数类型.委托类不单单只包含一个方法引用,它也可以保存多个方法的引用. 3.Lambda表达式直 ...