题目: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/单调栈)相关推荐

  1. 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 ...

  2. CodeForces - 1313C2 Skyscrapers (hard version)(单调栈+dp/分治)

    题目链接:点击查看 题目大意:给出 n 块连续的空地可以建造摩天大楼,政府有规定,每块地最高只能建 a[ i ] 的高度,同时每栋大楼需要满足一个规则,即每栋大楼的两侧不允许同时存在比自己高的大楼,输 ...

  3. 【CodeForces - 602D】Lipshitz Sequence(思维,单调栈,斜率单调性)

    题干: A function  is called Lipschitz continuous if there is a real constant Ksuch that the inequality ...

  4. 【华为机考】专题突破 第一周:单调栈 739 、503 、901、84

    刷题顺序参考于 <2023华为机考刷题指南:八周机考速通车> 前言 单调栈:分为单调递增和单调递减栈.(栈内元素成递增或者递减性): 单调递增栈:从栈底到栈顶数据是从大到小,即 栈内的元素 ...

  5. POJ2796 Feel Good(单调栈)

    题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...

  6. 【单调栈 前缀和 异或】7.21序列求和

    还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题.她定义一个区间的价值是max(ai)(l<=i<=r)∗(alxoral+1xor...xorar)max(ai) ...

  7. 栈与队列7——单调栈结构(进阶问题)

    题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...

  8. 栈与队列7——单调栈结构(初阶问题)

    题目 一个不含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{ ...

  9. 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]

    题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...

  10. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

最新文章

  1. Nagios的安装和基本配置(四:调试验证 错误总结)
  2. 程序员的自我救赎---13.1:职场招聘与面试心得
  3. 马斯克要办大学上了热搜
  4. javascript的null 和undifined
  5. C++与QML逻辑分离
  6. Linux添加用户(user)到用户组(group)
  7. 云服务器(uCloud)部署java web项目(二) 安装,配置apache服务器
  8. 飞畅 8口RS-485集线器产品性能参数介绍
  9. 【测试】提交BUG的标准规范
  10. 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
  11. 若依集成ip2region实现离线IP地址定位
  12. 听音乐是运用计算机的技术,计算机音乐技术在电影音乐中的运用
  13. springmvc form中 commandName和modelAttribute的疑问
  14. 相机dc内置滤镜 千奇百怪不离其踪 漫谈数码相机内置滤镜
  15. O2O两种典型运作模式结合案例分析
  16. Word类报表实例 - 质量检测报告
  17. Spring Security Oauth2 JWT、第三方登录、单点登录讲解,并使用Oauth2.0结合微服务进行单点登录
  18. Android 9.0中sdcard 的权限和挂载问题
  19. WordPress 前端投稿/编辑发表文章插件 DJD Site Post(支持游客和已注册用户)汉化版 免费下载...
  20. 出现 leaked ServiceConnection 解决办法

热门文章

  1. 他是程序员出身,如今身价上亿!一人干出了美国版的:携程、安居客、看准网!...
  2. 几何画板添加背景图片方法
  3. 地月距离竟然如此遥远
  4. Egyptian Collegiate Programming Contest (ECPC 2015)
  5. centos7开启网卡功能
  6. 怎么获取自定义核算项目里某一个类型的数据:做f7
  7. 大物实验数据处理——用C求标准误差、标准偏差、标准偏差、相对误差
  8. There are 1 missing blocks. The following files may be corrupted:
  9. SAP 生产成本明细报表
  10. 计算机不断自动重启,电脑一直自动重启,手把手教你电脑一直自动重启怎么解决...