题目链接:https://codeforces.ml/contest/1313/problem/C2
题目大意:
有n栋房子。每个房子的最高的高度b[i]应该在[1, a[i]]区间里。现在要满足不存在i<j<k有a[i]>a[j]<a[k]。并且要b[i]的和最大。输出b[i]-b[n]。方案可能不唯一。随便输出一个就可以。

思路:我们可以知道b[i]数组是一个单峰函数。并且最高的b[i]一定等于a[i]。
f[0[[i]:a[i]为1−i单增时。∑1ib[i]的最大值f[1[[i]:a[i]为n−i单增时。∑inb[i]的最大值那么f[0][i]+f[1][i]−a[i]就是以第i处为最高点时∑1nb[i]的最大值我们考虑状态转移方程:if(a[i]>a[i−1])f[0][i]=f[0][i−1]+a[i];elsef[0][i]=f[0][l[i]]+(i−l[i])∗a[i];f[1][i]的状态转移方程类似。l[i]:左边第一个<=a[i]的坐标。r[i]:右边第一个<=a[i]的坐标l[i]和r[i]可以用单调栈O(N)。分块O(N)。线段树O(log⁡n)。setO(log⁡n)求。\begin{array}{l} f[0[[i]:a[i]为1-i单增时。\sum_{1}^{i}b[i]的最大值\\ f[1[[i]:a[i]为n-i单增时。\sum_{i}^{n}b[i]的最大值\\ 那么f[0][i]+f[1][i]-a[i]就是以第i处为最高点时\sum_{1}^{n}b[i]的最大值\\\\ 我们考虑状态转移方程:\\ if(a[i]>a[i-1]) \\f[0][i]=f[0][i-1]+a[i]; \\\\ else\\ f[0][i]=f[0][l[i]]+(i-l[i])*a[i];\\\\ f[1][i]的状态转移方程类似。\\ l[i]:左边第一个<=a[i]的坐标。r[i]:右边第一个<=a[i]的坐标\\ l[i]和r[i]可以用单调栈O(N)。分块O(\sqrt{N})。线段树O(\log{n})。setO(\log{n})求。 \end{array} f[0[[i]:a[i]为1−i单增时。∑1i​b[i]的最大值f[1[[i]:a[i]为n−i单增时。∑in​b[i]的最大值那么f[0][i]+f[1][i]−a[i]就是以第i处为最高点时∑1n​b[i]的最大值我们考虑状态转移方程:if(a[i]>a[i−1])f[0][i]=f[0][i−1]+a[i];elsef[0][i]=f[0][l[i]]+(i−l[i])∗a[i];f[1][i]的状态转移方程类似。l[i]:左边第一个<=a[i]的坐标。r[i]:右边第一个<=a[i]的坐标l[i]和r[i]可以用单调栈O(N)。分块O(N​)。线段树O(logn)。setO(logn)求。​

#include<bits/stdc++.h>
#define LL long long
using namespace std;LL a[500005], l[500005], r[500005];
LL f[2][500005], tot=0, g[500005];
struct node{LL x, i;
}q[500005];
int main(){int n;scanf("%d", &n);for(int i=1; i<=n; i++){scanf("%lld", &a[i]);}//单调栈for(int i=1; i<=n; i++){if(tot==0||q[tot].x<a[i]){q[++tot]={a[i], i};}while(tot!=0&&q[tot].x>=a[i]){l[q[tot].i]=q[tot-1].i;r[q[tot].i]=i;tot--;}q[++tot]={a[i], i};}while(tot){l[q[tot].i]=q[tot-1].i;r[q[tot].i]=n+1;tot--;}//dpfor(int i=1; i<=n; i++){if(a[i]>a[i-1]){f[0][i]=f[0][i-1]+a[i];}else{f[0][i]=f[0][l[i]]+(i-l[i])*a[i];}}for(int i=n; i>=1; i--){if(a[i]>a[i+1]){f[1][i]=f[1][i+1]+a[i];}else{f[1][i]=f[1][r[i]]+(r[i]-i)*a[i];}}//方案LL mx=0, pos=0, now=0;for(int i=1; i<=n; i++){if(f[0][i]+f[1][i]-a[i]>mx){mx=f[0][i]+f[1][i]-a[i];pos=i;}}g[pos]=a[pos], now=a[pos];for(int i=pos+1; i<=n; i++){if(a[i]>=now){g[i]=now;}else{g[i]=a[i];now=g[i];}}now=a[pos];for(int i=pos-1; i>=1; i--){if(a[i]>=now){g[i]=now;}else{g[i]=a[i];now=g[i];}}for(int i=1; i<=n; i++){printf("%lld ", g[i]);}return 0;
}

Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)-单调栈+dp相关推荐

  1. Codeforces Round #622 (Div. 2) D. Happy New Year 状压dp

    传送门 文章目录 题意: 思路: 题意: n≤1e5,m≤1e9,k≤8.n\le 1e5,m\le 1e9,k\le 8.n≤1e5,m≤1e9,k≤8. 思路: 注意到题目中保证了每个孩子至多收到 ...

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

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

  3. Codeforces Round #568 (Div. 2)C2. Exam in BerSU (hard version)

    Codeforces Round #568 (Div. 2)C2. Exam in BerSU (hard version) 贪心+暴力 大致题意:N个人考试,每个人花费的时间是a[i],他们总共花费 ...

  4. Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp

    Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...

  5. Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp

    传送门 文章目录 题意: 思路: 题意: 思路: 之前做过类似的题,翻转一个字串相当于将任意两个不相交的串连在一起.再一看字符集≤20\le20≤20,那就是铁子集dpdpdp了. 定义f[i]f[i ...

  6. Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp + 输出方案

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,你需要将其分成若干组,每组的价值为max⁡(ai)−min(ai)\max(a_i)-min(a_i)max(ai​)−mi ...

  7. Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环

    传送门 文章目录 题意: 思路: 题意: 思路: 首先我们知道如果所有数的和summodk!=0sum\bmod k!=0summodk!=0那么此时无解,否则我们设need=sum/kneed=su ...

  8. Codeforces Round #635 (Div. 1) C. Kaavi and Magic Spell 区间dp

    传送门 文章目录 题意: 思路: 题意: 给你两个串s,ts,ts,t,每次都可以从sss的开头拿一个字符放到AAA串的开头或结尾,问最终有多少种方案使得ttt是AAA的前缀,注意sss不必全部拿完. ...

  9. Codeforces Round #674 (Div. 3) F. Number of Subsequences 简单计数dp

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,包含a,b,c,?a,b,c,?a,b,c,?四种字符,其中???可以变成为a,b,ca,b,ca,b,c的任意一种,让你求abca ...

  10. Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)

    题目链接:http://codeforces.com/contest/1157/problem/C2 当左右两边数字相同时,需要判断一下取哪边能得到更长的递增序列 #include <iostr ...

最新文章

  1. 谈 三层结构与MVC模式的区别
  2. 千万级在线推送系统架构解析
  3. Mysql计算出年纪
  4. Django 后台带有字典的列表数据与页面js交互
  5. oracle 审计结果表,oracle对某表进行审计,观察对这个表的增删改查等sql操作
  6. wamp环境下php命令运行时出现错误:无法启动此程序,因为计算机中丢失OCI.dll。尝试重新安装该程序以解决此问题...
  7. 5.8. tensorflow2实现SVD推荐系统——python实战 (下篇)
  8. 用c#语言制作ktv点歌系统,KTV点歌系统的设计与实现的设计和实现(C#,C/S,Access)
  9. Google Kickstart Round.B C. Diverse Subarray
  10. ctr预估之特征工程
  11. 央行数字货币在技术上是如何实现的
  12. Diligent收购领先的批判性见解和分析SaaS提供商Insightia
  13. 玩转数据可视化之R语言ggplot2:(四)单一基础几何图形绘制
  14. 计算机音乐nevada,Nevada
  15. 服务器电话销售话术,电话销售必看:让客户无法拒绝的13个经典话术
  16. PC按键精灵读取txt文本出现乱码怎么办?按键精灵手机助手读取txt文本中文变问号怎么办?
  17. 【HTML 教程系列第 11 篇】HTML 中常用的文本格式化标签
  18. python 操作mysql数据库查询数据
  19. 赋能 打造应对不确定性的敏捷团队 pdf_赋能——打造应对不确定的敏捷团队|《赋能》斯坦利...
  20. html5 plus.push,HTML5+规范:Push(管理推送消息功能)

热门文章

  1. phpstudy php56 zend,关于shopex 4.9 php5.6版安装环境问题
  2. 基于单神经元的自适应PID算法实现步骤与MATLAB代码
  3. linux中文是楷体,Linux中安装宋体楷体
  4. 基于 HTML5 + WebGL 的 3D 太阳系系统
  5. 使用Javascript 实现 分享到 新浪微博 QQ 空间等
  6. 【DB笔试面试642】在Oracle中,什么是基数反馈(Cardinality Feedback)?
  7. html5在线俄罗斯方块,html5网页版俄罗斯方块小游戏代码
  8. 算法导论———归并排序(JAVA、Python)
  9. Intent的设想与天马行空
  10. c语言俩小时不挂科——全程高能,没有废话