题目

n(n<=5e5)个数的数列,第i个数为ai(1<=ai<=1e9)

你需要构造一个新的序列b[],使得bi<=ai,且b数列满足以下三个条件之一:

①非严格单增 ②非严格单减 ③开口向下的单峰数列(有最大值,其左侧非严格增,其右侧非严格减)

最大化b[]数组所有元素的和,输出最后构造的b数列,多解输出其一即可

题解

单调栈,开二维pair,代表(取的值,取该值的个数)

l[i]和r[i]分别记录当枚举i为最大值点时左侧及右侧的贡献(均含本身),实时更新当前贡献和now

如果i左侧的值大于当前值a[i],就将其弹栈,记录个数,同化成当前值,最后向栈中加入(当前值,当前个数)

a[i]被重复计数,所以以i为最大值轴的总元素和为l[i]+r[i]-a[i],

取好轴之后,分别向两侧模拟还原即可

代码

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
typedef pair<int,int> P;
typedef long long ll;
#define fi first
#define se second
#define sci(x) scanf("%d",&(x))
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
int n,c,pos;
ll a[N],l[N],r[N],res[N],now,ans;
P stk[N];//(v,num)
bool upd(ll &x,ll y){if(x<y){x=y;return 1;}return 0;
}
int main(){sci(n);rep(i,1,n){scanf("%lld",&a[i]);}now=c=0;rep(i,1,n){int add=1;while(c && stk[c].fi>a[i]){add+=stk[c].se;now-=1ll*stk[c].se*stk[c].fi;c--;}now+=1ll*a[i]*add;stk[++c]=P(a[i],add);l[i]=now;}now=c=0;per(i,n,1){int add=1;while(c && stk[c].fi>a[i]){add+=stk[c].se;now-=1ll*stk[c].se*stk[c].fi;c--;}now+=1ll*a[i]*add;stk[++c]=P(a[i],add);r[i]=now;}rep(i,1,n){if(upd(ans,l[i]+r[i]-a[i])){pos=i;}}now=a[pos];rep(i,pos,n){now=min(now,a[i]);res[i]=now;}now=a[pos];per(i,pos,1){now=min(now,a[i]);res[i]=now;}rep(i,1,n){printf("%lld%c",res[i]," \n"[i==n]);}return 0;
} 

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

  1. Codeforces Round #709 (Div. 1) C. Skyline Photo dp + 单调栈优化

    传送门 文章目录 题意: 思路: 题意: 思路: 首先一个非常明显的dpdpdp式子就是f[i]=max(f[j]+val(j+1,i))f[i]=max(f[j]+val(j+1,i))f[i]=m ...

  2. 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. 思路: 注意到题目中保证了每个孩子至多收到 ...

  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 # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)

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

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

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

  6. Codeforces Round #555 (Div. 3) c2 d e f

    c2:Increasing Subsequence (hard version) 那边小取那边,然后相等比较后面的长度 #include<bits/stdc++.h> using name ...

  7. 差分 ---- Codeforces Round #672 (Div. 2):C2. Pokémon Army (hard version)[差分的思想]

    题目链接 题目大意:就算给你一序列,按照顺序出若干个数组成一个的序列,然后对这个序列定义一个权值就算奇数位置的和减去偶数位置的和,问你能的到的最大的权值是多少? **a1 - a2 + a3 - a4 ...

  8. Codeforces Round #672 (Div. 2) C2 - Pokémon Army (hard version)(贪心,维护变化值)

    x数组里选一个子数组y(原数组顺序),y1-y2+y3-y4+- 的最大值 然后还有q次交换操作,每次修改之后都要输出新的最大值 (1)如果没有修改,单纯对于当前数组考虑,我们最后选出来的点肯定是波峰 ...

  9. Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 栈 链表

    E. Correct Bracket Sequence Editor 题目连接: http://www.codeforces.com/contest/670/problem/E Description ...

  10. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

最新文章

  1. NYOJ 73 比大小
  2. Web前端好不好学?Web前端要学些什么呢?
  3. sql distinct 去重复 (mysql)
  4. python3 csv读写_在python3中读取、更新和写入更新的CSV文件
  5. JDK源码解析之 java.lang.Exception
  6. 新来个技术总监:谁在用isXxx形式定义布尔类型年后不用来了
  7. Android APK反编译详解
  8. 测试基础-03-用例设计方法:等价类、边界值、场景法、错误推测法
  9. cvpr2020 人脸检测与识别_CVPR2020 论文分类下载 「人脸识别+目标检测」
  10. api与密度转换公式_原油API度与比重换算表摄氏15
  11. 关于 石墨文档客户端 的案例分析
  12. 工业物联网解决方案:该如何打造智能工厂
  13. Linux FrameBuffer(一) —— FrameBuffer是什么?怎么用?
  14. insert用法(插入表内容)
  15. ensembl数据库BioMart使用,查找转录本ID在ensembl与refseq中的对应关系
  16. 石油大学网考 在线作业、在线考试 自动答题辅助工具
  17. matlab2015和2016关于fplot的一个区别
  18. csv(逗号分隔值)文件用Excel编辑
  19. nginx设置端口号和开启防火墙
  20. 黑客3款私密神器,确实太强了 !

热门文章

  1. Portraiture 3.5.6磨皮滤镜插件适用于Photoshop磨皮美化功能
  2. gin:通过dockerfile部署
  3. 什么是ASIC芯片?与CPU、GPU、FPGA相比如何?
  4. 让聊天机器人来填平技术鸿沟吧!
  5. 电脑里的所有播放器只能播放声音没有画面
  6. 商城系统mysql数据表设计_购物商城数据库设计-商品表设计
  7. 企业网站建设常用CMS建站系统推荐
  8. mongodb导入JSON数据报错:Document is larger than the maximum size
  9. mysql数据库名区分大小写_mysql数据库表名区分大小写
  10. Heat Map在生物信息学中的应用