Codeforces Round #622 (Div. 2).C2 - Skyscrapers (hard version)
第二次写题解,请多多指教!
http://codeforces.com/contest/1313/problem/C2 题目链接
不同于简单版本的暴力法,这个数据范围扩充到了五十万。所以考虑用单调栈的做法;
1.首先顺序逆序扫一遍,记录下每个点左边的最大高度和以及右边的最大高度和 存在l[i] r[i] 两个数组中;
2.第二步从前往后扫一边两个数组 ,得出每个点左右两边的最大高度和 l[i]+r[i]-a[i]; 以此找出最优的制高点,并标记其位置;
3.从制高点出发,向两边求高度。反向时,每个点的最终高度应满足 a[i]=min(a[i],a[i+1]);正向时,每个点的最终高度 a[i]=min(a[i],a[i-1]);
最后输出最终数组即可;
上代码
#include<bits/stdc++.h>
using namespace std;
long long a[],l[],r[];
int main()
{
stack<int>st;
int n;
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a[i];
}
for(int i=;i<=n;i++)
{
while(!st.empty()&&a[st.top()]>=a[i]) st.pop();
if(st.empty()) l[i]=i*a[i];
else l[i]=l[st.top()]+a[i]*(i-st.top());
st.push(i);
}
while (!st.empty()) st.pop();
for(int i=n;i>=;i--)
{
while(!st.empty()&&a[st.top()]>=a[i]) st.pop();
if(st.empty()) r[i]=(n-i+)*a[i];
else r[i]=r[st.top()]+a[i]*(st.top()-i);
st.push(i);
}
long long zuigao=,idex;
for(int i=;i<=n;i++)
{
if(r[i]+l[i]-a[i]>zuigao)
{
zuigao=r[i]+l[i]-a[i];
idex=i;
}
}
for(int i=idex-;i>=;i--)
{
a[i]=min(a[i+],a[i]);
}
for(int i=idex+;i<=n;i++)
{
a[i]=min(a[i-],a[i]);
}
for(int i=;i<=n;i++) cout<<a[i]<<" ";
}
最后,简单说一下简单版本的做法,即省去前面的左右扫描的步骤。直接假设每个点为最高点枚举即可。较为简单不再赘述。
Codeforces Round #622 (Div. 2).C2 - Skyscrapers (hard version)的更多相关文章
- Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)(单调栈,递推)
Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version) 题意: 你是一名建筑工程师,现给出 n 幢建筑的预计建设高度,你想建成峰状, ...
- 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最大"尖"性矩形,思维||分治
题:https://codeforces.com/contest/1313/problem/C2 题意:给出n个数,分别代表第i个位置所能搭建的最大高度,问以哪一个位置的塔的高度为基准向左的每一个塔都 ...
- Codeforces Round #622(Div 2) C1. Skyscrapers (easy version)
题目链接: C1. Skyscrapers (easy version) 题目描述: 有一行数,使得整个序列满足 先递增在递减(或者只递增,或者只递减) ,每个位置上的数可以改变,但是最大不能超过原来 ...
- 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
题意 N长度为500000以内,一个数字两边的数字不能都比他高,最多高一边 求他最大sum.叙述有问题,直接看样例 3 10 6 8 因为6左右都比他高,选择10 6 6或者6 6 8,sum明显前 ...
- Codeforces Round #622 (Div. 2) B. Different Rules(数学)
Codeforces Round #622 (Div. 2) B. Different Rules 题意: 你在参加一个比赛,最终按两场分赛的排名之和排名,每场分赛中不存在名次并列,给出参赛人数 n ...
- Codeforces Round #622 (Div. 2) A. Fast Food Restaurant(全排列,DFS)
Codeforces Round #622 (Div. 2) A. Fast Food Restaurant 题意: 你是餐馆老板,虽然只会做三道菜,上菜时还有个怪癖:一位客人至少上一道菜,且一种菜最 ...
- Codeforces Round #568 (Div. 2) C2. Exam in BerSU (hard version)
链接: https://codeforces.com/contest/1185/problem/C2 题意: The only difference between easy and hard ver ...
随机推荐
- NR / 5G - Uplink Carrier Waveform Generation
- yum安装logstash 不生效
问题描述 根据logstash的配置方法写了一个配置文件,并放入/etc/logstash/conf.d/目录下,然后我们运行logstash # service logstash start Log ...
- 记一次MySQL中Waiting for table metadata lock的解决方法
最近项目中的数据库查询经常挂起,应用程序启动后也报操作超时.测试人员就说数据库又挂了(貌似他们眼中的连接失败,查询无果都是挂了),通过 show processlist 一看,满屏都是 Waiting ...
- backgroud图片充满元素的方法
background-image: url("img/headimg.png"); height: 219px; background-size: 100% 100%; backg ...
- Sublime text3的安装以及python开发环境的搭建
作者:struct_mooc 博客地址:https://www.cnblogs.com/structmooc/p/12376601.html 一. Sublime text3的安装 1.sublime ...
- StarUML之四、StarUML的Diagrams(图)与Elements(元素)及相关属性
Diagrams(图)可以理解为画布 1:创建图 在右侧的Model Explorer管理界面的第一个节点右键,或者选择菜单中Model | Add Diagram | [DiagramType]都 ...
- Centos 7.5 搭建FTP配置虚拟用户
Centos 7.5 搭建FTP配置虚拟用户 1.安装vsftpd #vsftpd下载地址 http://mirror.centos.org/centos/7/os/x86_64/Packages/v ...
- RabbitMQ安装(发生系统错误5。拒绝访问。发生系统错误1067。进程意外终止。)
RabbitMQ安装步骤(windows) 1.RabbitMQ建立在强大的Erlang OTP平台上,因此我们首先需要安装Erlang. 2.接下来安装RabbitMQ服务rabbitmq-serv ...
- 8.python内置模块之random模块简介
Python中的random模块用于生成随机数. 常用的7个函数: 1.random.random():返回一个[0,1)之间的随机浮点值(双精度) 2.random.uniform(a,b):返回[ ...
- Python 实现选择排序
选择排序算法步骤: 找到数组中最小的那个元素中, 将它和数组的第一个元素交换位置, 在剩下的元素中找到最小的元素,将它和数组的第二个元素交换位置, 如此往复,知道将整个数组排序. 逐步分析: 假设一个 ...