给定一个数组A,构造一个数组B,满足,B先增再减(或者只增,只减), 且 bi <= ai
使得∑bi最大

#include <algorithm>
#include <vector>
#include <stack>
#define ll long long
#define PII pair<int, int>
#define FOR(i, s, e) for (int i = s; i <= e;i++)
#define ROF(i, e, s) for (int i = e; i >= s;i--)
#define debug(a) cout << #a << "=" << a << endl;
#define pb(a) push_back(a)
#define endl '\n'
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3f
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 7;
void init_code(){#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endif
}ll a[N],n;
int nex[N],prv[N];
ll f[N],fl[N],fr[N];
void NLE(){a[0]=-INF,a[n+1]=-INF;  // 设置默认值stack<int>st;//求nxtFOR(i,1,n+1){while(!st.empty() && a[st.top()]>a[i]){nex[st.top()]=i; st.pop();}   st.push(i);}  st.pop();//求prvROF(i,n,0){while(!st.empty() && a[st.top()]>a[i]){prv[st.top()]=i; st.pop();}   st.push(i);} st.pop();
}int main(int argc, char const *argv[])
{   init_code();cin>>n;FOR(i,1,n)cin>>a[i];// 求nxt,prv数组NLE();   //dpFOR(i,1,n){ int j=prv[i]; fl[i]=a[i]*(i-j) + fl[j]; }ROF(i,n,1){ int j=nex[i]; fr[i]=a[i]*(j-i) + fr[j]; }FOR(i,1,n){ f[i]=fl[i]+fr[i]-a[i]; }//求具体方案int id=max_element(f+1,f+1+n)-f;ROF(i,id-1,1)a[i]=min(a[i],a[i+1]);FOR(i,id+1,n)a[i]=min(a[i],a[i-1]);FOR(i,1,n){ cout<<a[i]<<" "; }return 0;
}

CF1313C2 Skyscrapers (hard version) -单调栈优化dp相关推荐

  1. CF1131 G. Most Dangerous Shark (单调栈优化dp)

    文章目录 problem solution code problem solution dpi:dp_i:dpi​: 前iii个多米诺骨牌全都倒下的最小花费 li,ril_i,r_ili​,ri​分别 ...

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

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

  3. Jzoj P6305 最小值___单调栈优化dp

    题目大意: 分析: 设dpidp_idpi​表示分割了前i个,最大能得到的价值 初值:dpi=f(mini=1iai)dp_{i}=f(min_{i=1}^{i}a_i)dpi​=f(mini=1i​ ...

  4. CF1131 G. Most Dangerous Shark(DP+单调栈优化)

    文章目录 problem solution code problem solution dpi:dp_i:dpi​: 前iii个多米诺骨牌全都倒下的最小花费 li,ril_i,r_ili​,ri​分别 ...

  5. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

  6. poj 2373(单调队列优化dp)

    在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...

  7. poj 1821(单调队列优化dp)

    题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...

  8. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  9. 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)

    题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...

  10. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

最新文章

  1. Cassandra 分布式集群
  2. rsync的基本使用
  3. html制作花样链接卡页面_使用HTML5实现刮刮卡效果
  4. Git操作之配置别名
  5. 2017-2018-1 20155324 《信息安全系统设计基础》第十四周学习总结
  6. sql语句--查询语句(MySQL)
  7. CNN 反向传播推导
  8. 开学季,复旦老师教你玩转“0”“1”浪漫!| 人物志
  9. DataSetProvider的Option属性
  10. python处理access数据库教程,Python操作Access数据库步骤
  11. Excel怎么隐藏指定文本单元格整行
  12. 【codevs 1329】东风谷早苗
  13. java有一只兔子 从出生_Java解决题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子。。。...
  14. 请查收!顶会AAAI 2020录用论文之自然语言处理篇
  15. 预测:深度学习未来的6种可能
  16. 2016年C语言专业课,2016-2018年中央财经大学C语言程序设计考研真题及答案解析(6)...
  17. 百度病了,必应挂了,Yandex疯了。
  18. 专利申请预审需要满足什么条件?
  19. 5G凭什么比4G快那么多?
  20. 我的世界如何增加小游戏服务器,我的世界服务器小游戏怎么玩 骨灰玩家手把手教学...

热门文章

  1. 如何搭建公司知识共享平台
  2. Python 基于语法提取音节个数的方法(可能不完美,欢迎指教)
  3. 80004005错误代码_0x80004005,小编教你解决0x80004005错误代码的方法
  4. 如何查看哪些期刊被SCI收录
  5. 华科计院数据库课程笔记
  6. 本地idea通过tomcat启动服务停滞
  7. 计算机科学 期刊 模板,计算机学报投稿模板.doc
  8. 美国诚实签经验——医生的预约单和赴美生子的费用明细表
  9. 2020-08-24 光纤通信第五章知识点整理
  10. java简历校园经历_简历校园经历如何编