P6647题解

考虑朴素的dp:

dp[i][j]dp[i][j]dp[i][j]表示前i天去了j天的最大价值,转移显然:

dp[i][j]=max⁡x∈[j−k,j−1](dp[i−1][x]+max⁡s∈[x+1,j](as))dp[i][j]=\max\limits_{x\in[j-k,j-1]}(dp[i-1][x]+\max\limits_{s\in[x+1,j]}(a_s))dp[i][j]=x∈[j−k,j−1]max​(dp[i−1][x]+s∈[x+1,j]max​(as​))

目前为止我们可以知道的优化就有两个:线段树优化以及单调栈分别优化dp+maxdp+maxdp+max和最大的a。

只有一个问题没有解决:在最小的天数内完成,这种带转移次数限制的让我们很自然的想到了wqs二分中的trick,我们可以在转移的时候-INF即可,那么最终的转移式子如下:

dp[j]=max⁡x∈[j−k,j−1](dp[x]+max⁡s∈[x+1,j](as))−infdp[j]=\max\limits_{x\in[j-k,j-1]}(dp[x]+\max\limits_{s\in[x+1,j]}(a_s))-infdp[j]=x∈[j−k,j−1]max​(dp[x]+s∈[x+1,j]max​(as​))−inf

线段树只需要简单的单点、区间修改和区间查询即可,时间复杂度O(nlogn)O(nlogn)O(nlogn)

其他细节可以见代码:

//Keep up your bright swords, for the dew will rust them.
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAX=2e6+10;
const int MOD=1e9+7;
inline int read()
{int s=0,w=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9')s=s*10+c-'0',c=getchar();
return s*w;
}
/*
如果要求在最小的时间里的最大那么可以在转移的时候减去INF,与wqs二分一样的套路
*/
int n,k;
int dp[MAX];
int a[MAX];
int t;
int sta[MAX],top;
const int INF=1e12;
//线段树维护dp[j]+max(j+1,i)
int maxx[MAX<<3],lazy[MAX<<3];
void pushup(int k)
{maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
}
void Add(int k,int l,int r,int w)
{lazy[k]+=w;maxx[k]+=w;
}
void pushdown(int k,int l,int r)
{int mid=l+r>>1;Add(k<<1,l,mid,lazy[k]);Add(k<<1|1,mid+1,r,lazy[k]);lazy[k]=0;
}
void change(int k,int l,int r,int x,int y,int w)
{if(x<=l&&r<=y){lazy[k]+=w;maxx[k]+=w;return;}pushdown(k,l,r);int mid=l+r>>1;if(x<=mid)change(k<<1,l,mid,x,y,w);if(y>mid)change(k<<1|1,mid+1,r,x,y,w);pushup(k);
}
int ask(int k,int l,int r,int x,int y)
{if(x<=l&&r<=y)return maxx[k];pushdown(k,l,r);int mid=l+r>>1;int res=-9*INF;if(y<=mid)return ask(k<<1,l,mid,x,y);else if(x>mid)return ask(k<<1|1,mid+1,r,x,y);else return max(ask(k<<1,l,mid,x,mid),ask(k<<1|1,mid+1,r,mid+1,y));
}//这里建议这么写,不然res的下界不好确定,其实大概-9e12差不多了
signed main()
{//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read(),k=read();
for(int i=1;i<=n;i++)a[i]=read();
top=0;
for(int i=1;i<=n;i++)
{while(top&&a[sta[top]]<=a[i]){change(1,0,n,sta[top-1],sta[top]-1,a[i]-a[sta[top]]);top--;}sta[++top]=i;change(1,0,n,i-1,i-1,dp[i-1]+a[i]);dp[i]=ask(1,0,n,max(0ll,i-k),i-1)-INF;
}
printf("%lld\n",dp[n]+((n-1)/k+1)*1ll*INF);//显然的向上取整
return 0;
}

P6647 [CCC 2019] Tourism相关推荐

  1. Oracle 交集、差集、并集

    交集:Intersect select customer_id,key_,value_ from t_customer_contact_bak ccc intersect select custome ...

  2. 南京大学计算机夏博士,夏思宇

    8. Joseph P. Robinson, Yu Yin, Zaid Khan, Ming Shao, Siyu Xia, Michael Stopa, Samson Timoner, Matthe ...

  3. 流利阅读 2019.1.27 The death of Venice? City’s battles with tourism and flooding reach crisis level

    下载 笔记版/无笔记版 pdf资料: GitHub - zhbink/LiuLiYueDu: 流利阅读pdf汇总 本文内容全部来源于流利阅读.流利阅读对每期内容均有很好的文章讲解,向您推荐. 您可以关 ...

  4. 流利阅读 2019.1.28 The death of Venice? City’s battles with tourism and flooding reach crisis level

    本文内容全部来源于流利阅读.流利阅读对每期内容均有很好的文章讲解,向您推荐. 您可以关注微信公众号:流利阅读 了解详情. The death of Venice? City's battles wit ...

  5. ccc计算机比赛如何报名,整理:加拿大的CCC是什么,怎么报名?

    原标题:整理:加拿大的CCC是什么,怎么报名? CCC计算机竞赛(全称 Canadian Computing Competition)由加拿大滑铁卢大学与清华大学联合举办面向高中生的CS计算机竞赛,是 ...

  6. 《繁凡的论文精读》(一)CVPR 2019 基于决策的高效人脸识别黑盒对抗攻击(清华朱军)

    点我一文弄懂深度学习所有基础和各大主流研究方向! <繁凡的深度学习笔记>,包含深度学习基础和 TensorFlow2.0,PyTorch 详解,以及 CNN,RNN,GNN,AE,GAN, ...

  7. 陈立杰再获FOCS 2019最佳学生论文奖

    来源:量子星图 本文约700字,建议阅读5分钟. 在计算机科学顶级会议FOCS 2019上,陈立杰"连中三元",共有三篇论文入围,是入围论文最多的研究者之一. 9月7日,第60届I ...

  8. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  9. 2019届宝鸡理数质检Ⅰ解析版

    一.选择题: 例6[2019届宝鸡市高三理科数学质检Ⅰ第6题] 现执行如图所示的程序框图,该算法的功能是[] \(A.\)求两个正数\(a\),\(b\)的最小公倍数 \(B.\)判断两个正数\(a\ ...

  10. 欢乐纪中A组周六赛【2019.6.1】

    前言 六一儿童节快乐(然而我还在学校) dalao都走了,导致只剩下我们这帮菜鸡在被虐 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRank PersonPersonPers ...

最新文章

  1. 为什么分散刷新没有死时间_分散项目为何失败(以及如何处理)
  2. toolkit,phonetextbox中实现用户按回车键会换行
  3. leetcode算法题--Wiggle Subsequence
  4. OpenCV在图像中添加文字,画点,画直线
  5. suoi14 子树查找 (dfs)
  6. Netty入门系列(2) --使用Netty解决粘包和拆包问题
  7. 第十二章 网络搭建及训练
  8. image转base64
  9. 1001 Hello,World!
  10. 阵列信号处理-学习笔记003-波束形成
  11. 复杂性,科学,方法论?
  12. 7种常用的数据标注工具
  13. Ubuntu 20.04 下 MOSEK 9.3 的安装
  14. 打印显示服务器脱机win10,如何在Win10中将打印机状态从脱机更改为联机
  15. u盘iso安装服务器系统怎么安装win7系统安装方法,win7系统iso镜像文件通过U盘安装的操作方法...
  16. 《缠中说禅108课》37:背驰的再分辨
  17. win10桌面快捷方式变白,解决方式
  18. 多糖水凝胶的交联方式及分析方法
  19. 斐波那契数列各种方法求解
  20. CocoaPods的spec

热门文章

  1. 面试必考之Java三大特性
  2. 鸿蒙系统电脑配置,鸿蒙系统 你装机了吗?
  3. u大师u盘自定义ISO/IMG文件装机教程
  4. PLSQL导出表结构和表数据
  5. BC95-G NB-IOT 模块使用
  6. 如何实现USB自动挂载?
  7. iMC iNode客户端上岗证
  8. Linux自学之旅-安装篇(格式化)
  9. DSGE模型的Stata实现简介
  10. AForge 拍照 GetCurrentVideoFrame().GetHbitmap 内存不足