Skyscrapers (hard version)(1900/单调栈)
题目:http://codeforces.com/contest/1313/problem/C2
参考:http://codeforces.com/blog/entry/74146
题意:给定n个数aia_iai,要求构造一个序列bib_ibi,使得bi<=aib_i<=a_ibi<=ai,且序列bib_ibi满足先非严格增,后非严格减的特性。定义lil_ili表示从左到右扫描到i时的最大递增值总和,那么li=lj+(i−j)∗a[i]l_i=l_j+(i-j)*a[i]li=lj+(i−j)∗a[i],其中jjj是第一个值小于a[i]a[i]a[i]的位置,基于最近和单调这个特性,我们可以构造单调栈来求jjj;类似的,我们可以定义rir_iri。最后最优答案就是max(li+ri−ai)max(l_i+r_i-a_i)max(li+ri−ai),找出峰顶位置后,就可以在aia_iai的基础上构造bib_ibi了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 500010;
#define ll long long
int n,a[maxn];
ll l[maxn],r[maxn];
int main() {scanf("%d",&n);stack<int> st;for(int i = 1;i <= n;i++) {scanf("%d",&a[i]);while(!st.empty() && a[st.top()] >= a[i]) {st.pop();}if(st.empty()) l[i] = 1LL*i*a[i];else l[i] = l[st.top()]+1LL*(i-st.top())*a[i];st.push(i);}while(!st.empty()) st.pop();for(int i = n;i >= 1;i--) {while(!st.empty() && a[st.top()] >= a[i]) {st.pop();}if(st.empty()) r[i] = 1LL*(n-i+1)*a[i];else r[i] = r[st.top()]+1LL*(st.top()-i)*a[i];st.push(i);}int pos = 1;ll res = l[1]+r[1]-a[1];for(int i = 2;i <= n;i++) {if(l[i]+r[i]-a[i] > res) {res = l[i]+r[i]-a[i];pos = i;}}for(int i = pos-1;i >= 1;i--) a[i] = min(a[i],a[i+1]);for(int i = pos+1;i <= n;i++) a[i] = min(a[i],a[i-1]);for(int i = 1;i <= n;i++)printf("%d ",a[i]);return 0;
}
Skyscrapers (hard version)(1900/单调栈)相关推荐
- Skyscrapers (hard version) CodeForces - 1313C2(单调栈)
This is a harder version of the problem. In this version n≤500000 The outskirts of the capital are b ...
- CodeForces - 1313C2 Skyscrapers (hard version)(单调栈+dp/分治)
题目链接:点击查看 题目大意:给出 n 块连续的空地可以建造摩天大楼,政府有规定,每块地最高只能建 a[ i ] 的高度,同时每栋大楼需要满足一个规则,即每栋大楼的两侧不允许同时存在比自己高的大楼,输 ...
- 【CodeForces - 602D】Lipshitz Sequence(思维,单调栈,斜率单调性)
题干: A function is called Lipschitz continuous if there is a real constant Ksuch that the inequality ...
- 【华为机考】专题突破 第一周:单调栈 739 、503 、901、84
刷题顺序参考于 <2023华为机考刷题指南:八周机考速通车> 前言 单调栈:分为单调递增和单调递减栈.(栈内元素成递增或者递减性): 单调递增栈:从栈底到栈顶数据是从大到小,即 栈内的元素 ...
- POJ2796 Feel Good(单调栈)
题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...
- 【单调栈 前缀和 异或】7.21序列求和
还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题.她定义一个区间的价值是max(ai)(l<=i<=r)∗(alxoral+1xor...xorar)max(ai) ...
- 栈与队列7——单调栈结构(进阶问题)
题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...
- 栈与队列7——单调栈结构(初阶问题)
题目 一个不含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{ ...
- 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]
题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...
- 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]
题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...
最新文章
- Nagios的安装和基本配置(四:调试验证 错误总结)
- 程序员的自我救赎---13.1:职场招聘与面试心得
- 马斯克要办大学上了热搜
- javascript的null 和undifined
- C++与QML逻辑分离
- Linux添加用户(user)到用户组(group)
- 云服务器(uCloud)部署java web项目(二) 安装,配置apache服务器
- 飞畅 8口RS-485集线器产品性能参数介绍
- 【测试】提交BUG的标准规范
- 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
- 若依集成ip2region实现离线IP地址定位
- 听音乐是运用计算机的技术,计算机音乐技术在电影音乐中的运用
- springmvc form中 commandName和modelAttribute的疑问
- 相机dc内置滤镜 千奇百怪不离其踪 漫谈数码相机内置滤镜
- O2O两种典型运作模式结合案例分析
- Word类报表实例 - 质量检测报告
- Spring Security Oauth2 JWT、第三方登录、单点登录讲解,并使用Oauth2.0结合微服务进行单点登录
- Android 9.0中sdcard 的权限和挂载问题
- WordPress 前端投稿/编辑发表文章插件 DJD Site Post(支持游客和已注册用户)汉化版 免费下载...
- 出现 leaked ServiceConnection 解决办法
热门文章
- 他是程序员出身,如今身价上亿!一人干出了美国版的:携程、安居客、看准网!...
- 几何画板添加背景图片方法
- 地月距离竟然如此遥远
- Egyptian Collegiate Programming Contest (ECPC 2015)
- centos7开启网卡功能
- 怎么获取自定义核算项目里某一个类型的数据:做f7
- 大物实验数据处理——用C求标准误差、标准偏差、标准偏差、相对误差
- There are 1 missing blocks. The following files may be corrupted:
- SAP 生产成本明细报表
- 计算机不断自动重启,电脑一直自动重启,手把手教你电脑一直自动重启怎么解决...