X - Skyscrapers (hard version) CodeForces - 1313C2
题目大意:n个高楼,每个楼最高为mi,要求,第i个楼左边和右边不能有同时比它高的楼。让你求最在n个楼总和最高的情况下,每个楼的高度。
题解:用单调栈来做,n个楼的高度要么是单调递减,要么是单调递增,要么就是先曾后减,就这3种情况,其他的不可能。
维护一个单调非递减的栈,并且维护一个数组ans[],第i个位置,维护的是i左边的所有楼的最大高度和。
当新元素比栈顶元素大时或者直接ans[i]=m[i]+ans[i-1]。当新元素比栈顶元素小时,一直出栈,直到栈为空(ans[i]=arr[i]*i),或者找到一个比新元素小于等于设为top的,也就是说top到i之间的元素都要比i元素大
所以ans[i]=ans[i-1]+arr[i]*(i-top)。然后数组逆序在来一遍。
遍历一遍数组,拼接左端与右端,找到和最大时的峰值。然后......
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=5E5+;
ll arr[N];
ll lans[N];
ll rans[N];
ll n;
void solve(ll ans []){
stack<ll >st;
ans[]=;
for(ll i=;i<=n;i++){
if(st.empty()) {
st.push(i);
ans[i]=arr[i]+ans[i-];
}
else {
ll top=st.top();
while(st.size()&&arr[i]<arr[top]){
st.pop();
if(st.empty()) {
break;
}
top=st.top();
}
if(st.empty()) ans[i]=i*arr[i];
else {
top=st.top();
ans[i]=arr[i]*(i-top)+ans[top];
}
st.push(i);
}
}
}
int main()
{ cin>>n;
for(ll i=;i<=n;i++) cin>>arr[i];
solve(lans);
reverse(arr+,arr++n);
solve(rans);
ll ans=,pos;
for(ll i=;i<=n;i++){
ll c=lans[i]+rans[n-i];
if(c>=ans) {
ans=c;
pos=i;
}
}
reverse(arr+,arr++n);
for(ll i=pos-;i>=;i--){
if(arr[i]>arr[i+]) arr[i]=arr[i+];
}
for(ll i=pos+;i<=n;i++) {
if(arr[i]>arr[i-]) arr[i]=arr[i-];
}
for(ll i=;i<=n;i++) cout<<arr[i]<<" "; return ;
}
X - Skyscrapers (hard version) CodeForces - 1313C2的更多相关文章
- 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)
题目链接 : C2. Skyscrapers (hard version) 题目描述 : 与上一道题类似,只是数据范围变大, 5e5, 如果用我们原来的方法,铁定是超时的. 考察点 : 单调栈,贪心, ...
- Codeforces Round #622(Div 2) C1. Skyscrapers (easy version)
题目链接: C1. Skyscrapers (easy version) 题目描述: 有一行数,使得整个序列满足 先递增在递减(或者只递增,或者只递减) ,每个位置上的数可以改变,但是最大不能超过原来 ...
- 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)
第二次写题解,请多多指教! http://codeforces.com/contest/1313/problem/C2 题目链接 不同于简单版本的暴力法,这个数据范围扩充到了五十万.所以考虑用单调栈的 ...
- Codeforces Round #622 (Div. 2) C2 - Skyscrapers (hard version) 单调栈
从左往右扫,找到比第i个小的第一个数字,l[i] = l[last] + (i - last) * m[i],用单调栈O(n)维护这个过程,再从右往左扫,同理可以算出r数组,注意一下long long ...
- D2. Kirk and a Binary String (hard version) D1 Kirk and a Binary String (easy version) Codeforces Round #581 (Div. 2) (实现,构造)
D2. Kirk and a Binary String (hard version) time limit per test1 second memory limit per test256 meg ...
- Array and Segments (Easy version) CodeForces - 1108E1 (暴力枚举)
The only difference between easy and hard versions is a number of elements in the array. You are giv ...
随机推荐
- Javascript之网页版待办事项
本文使用原生JS实现站点 http://www.todolist.cn/ 的基本功能. 其中页面的HTML布局和CSS样式取用原站,JS部分为自己编写. 效果图 完整代码 HTML.JS部分 < ...
- [LeetCode] 936. Stamping The Sequence 戳印序列
You want to form a `target` string of lowercase letters. At the beginning, your sequence is target.l ...
- 有效括号算法题(Golang实现)
有效括号算法题 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空 ...
- MYSQL-----------实验一 MySQL的安装与命令初步
(1)启动MySQL,并打开任务管理器查看服务进程是否已经启动. (2) 进入Windows命令行,使用命令登录MySQL服务器. (3) 使用show命令查看当前系统的字符集,并修改其中的两 ...
- C 部落划分
时间限制 : - MS 空间限制 : - KB SPJ 评测说明 : 1s,128m 问题描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人 ...
- CentOS-7.6 下搭建 NIS 服务器
##服务端配置: ####Server: 192.168.0.178(CentOS 7.6) # systemctl stop firewalld # systemctl disable firewa ...
- Light of future-测试总结
目录 1.描述项目的测试工作安排 2.测试工具选择和运用 3.测试用例文档pdf的github链接地址 4.测试体会 5.项目测试评述 发布界面 后台CRUD 归属班级 →2019秋福大软件工程实践Z ...
- Linux学习66 运维安全-通信加密和解密技术入门
一.Linux Service and Security 1.OpenSSL(ssl/tls)协议 2.OpenSSH(ssh)协议 3.bind(dns) 4.web(http):httpd(apa ...
- 【JavaScript】js02
正则对象. 声明: //var reg = new RegExp('', '');// i,g 修正符. // i,不区分大小写,g 全局匹配. //var reg = /\w/i; 方法: //ex ...
- 如何设置微信小程序顶部标题
直接在对应的xxx.json中支配如下,就可以了哈 { "backgroundTextStyle": "light", //字体 "navigatio ...