第二次写题解,请多多指教!

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]<<" ";
}

最后,简单说一下简单版本的做法,即省去前面的左右扫描的步骤。直接假设每个点为最高点枚举即可。较为简单不再赘述。

最新文章

  1. URL安全的Base64编码
  2. VS开发中的代码编写小技巧&mdash;&mdash;避免重复代码编写的几种方法
  3. Travel Problem[SZU_K28]
  4. RN组件之ToolbarAndroid
  5. Cisco SDM
  6. 编程实例--for循环,找出0~100之间与8有关的正整数
  7. Python3 列表
  8. svn + jenkins + maven 实现java环境的自动化构建和部署
  9. Netty ByteBuf源码分析
  10. js中变量base64加密传输
  11. Java订单功能模块设计与实现
  12. 实验效果展示(会声会影+FSCapture)
  13. sql server 内存初探
  14. 龙芯yl8089无声音的解决方案
  15. nodejs,javascript过滤emoj表情
  16. crontab定时作业
  17. 【JavaFx教程】第五部分:将数据用 XML 格式存储
  18. grpc-golang实现账号and密码认证
  19. PHP CURL HTTPS内存泄露问题
  20. LOJ#3086. 「GXOI / GZOI2019」逼死强迫症(矩阵快速幂)

热门文章

  1. 自定义内建模块 - Python Build Your Own Built-In Module
  2. C语言RH850 F1L serial bootloader和C#语言bootloader PC端串口通信程序
  3. 【全集】大数据Linux基础
  4. getElementsByName和getElementById获取控件
  5. 如何重写object虚方法
  6. Magicodes.IE基础教程之导出Pdf
  7. springBoot2.x启动项目报java.sql.SQLNonTransientConnectionException
  8. 14.Android-使用sendMessage线程之间通信
  9. Policy-based Approach(基于策略的方法)
  10. C#实现的Table的Merge,以及实现Table的Copy和Clone