P6647 [CCC 2019] Tourism
P6647题解
考虑朴素的dp:
dp[i][j]dp[i][j]dp[i][j]表示前i天去了j天的最大价值,转移显然:
dp[i][j]=maxx∈[j−k,j−1](dp[i−1][x]+maxs∈[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]=maxx∈[j−k,j−1](dp[x]+maxs∈[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相关推荐
- Oracle 交集、差集、并集
交集:Intersect select customer_id,key_,value_ from t_customer_contact_bak ccc intersect select custome ...
- 南京大学计算机夏博士,夏思宇
8. Joseph P. Robinson, Yu Yin, Zaid Khan, Ming Shao, Siyu Xia, Michael Stopa, Samson Timoner, Matthe ...
- 流利阅读 2019.1.27 The death of Venice? City’s battles with tourism and flooding reach crisis level
下载 笔记版/无笔记版 pdf资料: GitHub - zhbink/LiuLiYueDu: 流利阅读pdf汇总 本文内容全部来源于流利阅读.流利阅读对每期内容均有很好的文章讲解,向您推荐. 您可以关 ...
- 流利阅读 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 ...
- ccc计算机比赛如何报名,整理:加拿大的CCC是什么,怎么报名?
原标题:整理:加拿大的CCC是什么,怎么报名? CCC计算机竞赛(全称 Canadian Computing Competition)由加拿大滑铁卢大学与清华大学联合举办面向高中生的CS计算机竞赛,是 ...
- 《繁凡的论文精读》(一)CVPR 2019 基于决策的高效人脸识别黑盒对抗攻击(清华朱军)
点我一文弄懂深度学习所有基础和各大主流研究方向! <繁凡的深度学习笔记>,包含深度学习基础和 TensorFlow2.0,PyTorch 详解,以及 CNN,RNN,GNN,AE,GAN, ...
- 陈立杰再获FOCS 2019最佳学生论文奖
来源:量子星图 本文约700字,建议阅读5分钟. 在计算机科学顶级会议FOCS 2019上,陈立杰"连中三元",共有三篇论文入围,是入围论文最多的研究者之一. 9月7日,第60届I ...
- 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结
蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...
- 2019届宝鸡理数质检Ⅰ解析版
一.选择题: 例6[2019届宝鸡市高三理科数学质检Ⅰ第6题] 现执行如图所示的程序框图,该算法的功能是[] \(A.\)求两个正数\(a\),\(b\)的最小公倍数 \(B.\)判断两个正数\(a\ ...
- 欢乐纪中A组周六赛【2019.6.1】
前言 六一儿童节快乐(然而我还在学校) dalao都走了,导致只剩下我们这帮菜鸡在被虐 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRank PersonPersonPers ...
最新文章
- 为什么分散刷新没有死时间_分散项目为何失败(以及如何处理)
- toolkit,phonetextbox中实现用户按回车键会换行
- leetcode算法题--Wiggle Subsequence
- OpenCV在图像中添加文字,画点,画直线
- suoi14 子树查找 (dfs)
- Netty入门系列(2) --使用Netty解决粘包和拆包问题
- 第十二章 网络搭建及训练
- image转base64
- 1001	Hello,World!
- 阵列信号处理-学习笔记003-波束形成
- 复杂性,科学,方法论?
- 7种常用的数据标注工具
- Ubuntu 20.04 下 MOSEK 9.3 的安装
- 打印显示服务器脱机win10,如何在Win10中将打印机状态从脱机更改为联机
- u盘iso安装服务器系统怎么安装win7系统安装方法,win7系统iso镜像文件通过U盘安装的操作方法...
- 《缠中说禅108课》37:背驰的再分辨
- win10桌面快捷方式变白,解决方式
- 多糖水凝胶的交联方式及分析方法
- 斐波那契数列各种方法求解
- CocoaPods的spec