C2. Skyscrapers (hard version)

link
单调栈模板||别点了点了也没有

题意:给定n个数字,表示第i个位置的楼高上限ai。要求所有楼中不能出现谷,问总楼层数最大时,每个位置楼高,输出。

所有数列构成单峰函数,递增、递减或者只能含有一个峰。easy version数据范围只有1e3可暴力枚举峰,hard version是5e5,需要优化

反正我是不会但是看了题解太妙了

优化放在每次枚举最高点的时候,在之前枚举的时候需要从头到尾再来一遍统计当前的总楼层数ans,现在定义两个状态:

  • dp[i][0]表示从1~i 为非严格单调递增序列的总楼层数最大值,转移方程:

    1. 当a[i]>=a[i-1]时候最简单,直接对上一个位置加上当前楼层:
      dp[i][0]=dp[i-1][0]+a[i]
    2. 当a[i]<a[i-1]时,向前找第一个小于等于a[i]的数字下标。在这里记为l[i],那么从下标为l[i]+1~n之间的数字都设置为a[i]是最优解:
      dp[i][0]=dp[l[i]][0]+a[i]*(i-l[i])
  • 同理处理dp[i][1],表示从i~n+1 为非严格递减序列的总楼层最大值,转移方程是这俩:
    1. if(a[i]>=a[i+1]) dp[i][1]=dp[i+1][1]+a[i];
    2. else dp[i][1]=dp[r[i]][1]+a[i]*(r[i]-i);

现在就是对假设i为最高峰时候,总楼层数最大值的表示:dp[i][0]+dp[i][1]-a[i](先增后减再减去重叠部分a[i])

在寻找左右小于等于a[i]的下标时候用单调栈处理

LL a[maxn];
LL dp[maxn][2];
int l[maxn],r[maxn];
int main(){int n=ird();for(int i=1;i<=n;i++){a[i]=lrd();}stack<int> s;for(int i=1;i<=n;i++){while(s.size()&&a[s.top()]>a[i]) s.pop();if(s.empty()) l[i]=0;elsel[i]=s.top();s.push(i);if(a[i]>=a[i-1])dp[i][0]=dp[i-1][0]+a[i];elsedp[i][0]=dp[l[i]][0]+a[i]*(i-l[i]);}stack<int> st;for(int i=n;i>=1;i--){while(st.size()&&a[st.top()]>a[i]) st.pop();if(st.empty()) r[i]=n+1;elser[i]=st.top();st.push(i);if(a[i]>=a[i+1])dp[i][1]=dp[i+1][1]+a[i];elsedp[i][1]=dp[r[i]][1]+a[i]*(r[i]-i);}LL ans=0;int tag=1;for(int i=1;i<=n;i++){LL tt=0;tt=dp[i][0]+dp[i][1]-a[i];if(tt>ans){tag=i;ans=tt;}}LL minn=a[tag];for(int i=tag;i>=1;i--){minn=min(minn,a[i]);a[i]=minn;}minn=a[tag];for(int i=tag+1;i<=n;i++){minn=min(minn,a[i]);a[i]=minn;}for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl;return 0;
}

附上sb暴力c1代码对比sbbbbbbbb落泪嗷
可以看到就是优化了枚举最高峰时候的每次遍历

LL n,a[maxn];
LL ans[maxn];
map<int,int> m;
int main(){n=lrd();for(int i=1;i<=n;i++){a[i]=lrd();}int f=0;LL ans=0;LL minn=1e9+10;int tag=1;for(int i=1;i<=n;i++){minn=a[i];LL tt=0;for(int j=i;j>=1;j--){minn=min(minn,a[j]);tt+=minn;}minn=a[i];for(int j=i+1;j<=n;j++){minn=min(minn,a[j]);tt+=minn;}if(tt>ans)tag=i;ans=max(ans,tt);}minn=a[tag];for(int i=tag;i>=1;i--){minn=min(minn,a[i]);a[i]=minn;}minn=a[tag];for(int i=tag+1;i<=n;i++){minn=min(minn,a[i]);a[i]=minn;}for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl;return 0;
}

C2. Skyscrapers (hard version)(单调栈、dp)相关推荐

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

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

  2. CodeForces - 1407D Discrete Centrifugal Jumps(单调栈+dp)

    题目链接:点击查看 题目大意:给出 n 个大楼的高度记为 h,现在需要从第一个大楼到达第 n 个大楼,问最小步数是多少,只有满足以下条件时才能从 i 移动到 j ,设 i < j: 题目分析:无 ...

  3. [ZJOI2007] 棋盘制作(单调栈 / DP悬线法)

    problem 洛谷链接 solution1-单调栈 很容易想到,预处理出每个点向上最大能延伸的长度,然后对每个点求一个矩阵面积. 然后思考优化,不难想到每次对一行进行求解. 每一行的所有列一起构成了 ...

  4. P3400 仓鼠窝 (单调栈 dp

    添加链接描述 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e3+9; l ...

  5. P3400 仓鼠窝 (单调栈 dp O(n*m

    添加链接描述 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e3+9; l ...

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

  7. bzoj 1233: [Usaco2009Open]干草堆tower【dp+单调栈】

    参考:https://www.cnblogs.com/N-C-Derek/archive/2012/07/11/usaco_09_open_tower.html 虽然长得很像斜率优化,但是应该不算-- ...

  8. hdu 1506(dp || 单调栈)

    题意:这题是要找最大的矩形面积. 解题思路:这题的关键是要找每个条形能够往左和往右能够到达的最大长度.我最开始的思路是单调栈去维护,只要入栈的元素比栈顶元素小,栈顶就要出栈,并且知道其最右能够到达的最 ...

  9. HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)

    你是不是飘了?骚年! Problem Description A histogram is a polygon composed of a sequence of rectangles aligned ...

  10. CodeForces - 1484E Skyline Photo(dp+单调栈)

    题目链接:点击查看 题目大意:给出 nnn 个建筑,每个建筑有一个高度和一个美丽值,现在要求划分为数个连续的区间,使得所有区间的贡献之和最大,其中每个区间的贡献值为,区间中高度最低的建筑物的美丽值 题 ...

最新文章

  1. RADAR和LIDAR区别分析
  2. vue 怎么全局到入常量_午后躺椅上看关于Vue的20点
  3. java渐变色字体生成器_java阴影文字效果怎么做?渐变的怎么做?
  4. linux mono mysql_LJMM平台( Linux +Jexus+MySQL+mono) 上使用MySQL的简单总结
  5. unity, 同步物体坐标一定要在LateUpdate中进行
  6. 书摘---创业36条军规1:创业是怎么回事
  7. 实战 | F1060路由模式典型组网配置案例(静态路由)
  8. bootstrap 悬浮固定_开箱测评|悬浮歌词蓝牙音箱,视听享受!
  9. system1之:文件和目录管理
  10. Oracle --- 表空间
  11. [论文评析]Density‑based weighting for imbalanced regression,Machine Learning,2021
  12. idea中Empty tag doesn‘t work in some browsers 浏览器中一片空白,没有渲染样式,
  13. 计算机系统引导失败怎么办,win7系统引导选择失败怎么办|win7系统引导选择失败的解决方法...
  14. graphpad如何检测方差齐_【求助】急求如何用Graphpad Prism6 做析因设计方差分析?谢谢各位大神...
  15. 如何混合使用Linux和Windows
  16. 用while循环写四叶玫瑰数(自幂数)
  17. 华为苏箐被曝转投大众汽车:最狂智能车高管,因抨击特斯拉丢工作,任正非亲自签发罢免令...
  18. 记码农十周年(20110214--20210214)
  19. Pico XR Unity开发时如何设置应用版权保护
  20. CISA 督促VMware 管理员修复Workspace ONE UEM 中的严重漏洞

热门文章

  1. R语言笔记:机器学习【K近邻】
  2. 量化交易8-backtrader回测道氏理论中反转形态K线形态图
  3. oCPC实践录 | 成本优化策略之eCPC(2)
  4. 看完这篇,轻松解决FastReport合并单元格!
  5. 【用EXCEL编写俄罗斯方块小游戏(基于VBA)】
  6. python自动化:uiautomation、pyautogui操作会计记账系统(2)处理收支明细表
  7. html 在线播放器,实现简易html视频播放器的方法
  8. markdown合并单元格
  9. matlab中加载数据方式,【转帖】Matlab数据导入方法
  10. 电脑ping手机该怎么玩(很多网友都说电脑ping不通手机)