洛谷题面传送门

怎么题解区全是 2log 的做法/jk,这里提供一种 1log 并且代码更短(bushi)的做法。

首先考虑对于一个序列 \(a\) 怎样计算将其变成单调不降的最小代价。对于这类涉及区间操作问题,果断往差分序列方向想,我们记 \(d_i=a_i-a_{i+1}\),那么我们肯定会想将所有 \(d\) 都变成非正的,而一次操作肯定会将某个 \(d_i\) 减 \(1\),并选择将某个 \(d_i\) 加 \(1\)(当然也可以不操作)。加一肯定是不优的,因此我们每次肯定会选择最右边的元素作为右端点避免加一操作。因此将序列 \(d\) 变成非正的代价就是 \(\sum\max(d_i,0)\)。

接下来就可以考虑 DP 了。我们设 \(dp_{i,j}\) 表示序列最后一个元素是 \(a_i\),当前 \(\sum\max(d_i,0)=j\) 最多保留了多少株玉米。那么有转移 \(dp_{i,j}=\max\limits_{l<i}dp_{l,j-\max(a_l-a_j,0)}+1\)。直接转移是 \(n^2k\) 的。不过注意到这题的值域很小,因此考虑将 \(\max\) 然后 BIT 处理偏序关系,具体来说,如果 \(a_l<a_j\),那么 \(dp_{l,j}+1\to dp_{i,j}\),我们就建立 \(k\) 个树状数组,第 \(j\) 个下标为 \(t\) 的位置维护 \(a_l=t\) 的 \(l\) 中 \(dp_{l,j}\) 的最大值,那么这一类转移就在第 \(j\) 个树状数组中取一遍前缀 \(\max\) 即可。如果 \(a_l\ge a_j\),那么 \(dp_{l,j-a_l+a_j}+1\to dp_{l,j}\)。不难发现这一类 DP 转移来的 \(dp_{l,t}\) 一定有 \(t+a_l=j+a_i\),于是我们建立 \(5500\) 个 BIT,第 \(i\) 个下标为 \(j\) 的位置维护 \(t+a_l=i,a_l=j\) 的 \(dp_{l,t}\) 的最大值,这样这一类 DP 转移即可写成后缀和的形式,也可 BIT 维护。

复杂度 \(nk\log n\)。

const int MAXN=10000;
const int MAXK=500;
const int MAXV=5000;
int n,k,a[MAXN+5];
struct fenwick{
int t[MAXV+5];
void add(int x,int v){for(int i=x;i<=MAXV;i+=(i&(-i))) chkmax(t[i],v);}
int query(int x){int ret=0;for(int i=x;i;i&=(i-1)) chkmax(ret,t[i]);return ret;}
} t1[MAXK+MAXV+5],t2[MAXV+5];
int main(){
scanf("%d%d",&n,&k);int res=0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
for(int j=0;j<=k;j++){
int val=max(t1[j+a[i]].query(MAXV-a[i]+1),t2[j].query(a[i]))+1;
t1[j+a[i]].add(MAXV-a[i]+1,val);t2[j].add(a[i],val);chkmax(res,val);
}
} printf("%d\n",res);
return 0;
}

洛谷 P3287 - [SCOI2014]方伯伯的玉米田(BIT 优化 DP)的更多相关文章

  1. 洛谷P3287 [SCOI2014]方伯伯的玉米田(树状数组)

    传送门 首先要发现,每一次选择拔高的区间都必须包含最右边的端点 为什么呢?因为如果拔高了一段区间,那么这段区间对于它的左边是更优的,对它的右边会更劣,所以我们每一次选的区间都得包含最右边的端点 我们枚 ...

  2. 【题解】Luogu P3287 [SCOI2014]方伯伯的玉米田

    原题传送门 一眼就能看出来这是一道dp题 显而易见每次操作的右端点一定是n,每株玉米被拔高的次数随位置不下降 用f(i,j) 表示以第i 株玉米结尾它被拔高了j 次的最长序列长度. \(f(i,j)= ...

  3. P3287 [SCOI2014]方伯伯的玉米田

    首先可以证明,一定存在一种最优解,每次选择的区间结尾都是 \(n\).因为如果某一个区间结尾不是 \(n\),将其替换成 \(n\) 仍然保持单调不下降.接着都按这个策略拔高玉米. 令 \(f_{i, ...

  4. 洛谷P3286 [SCOI2014]方伯伯的商场之旅

    题目:洛谷P3286 [SCOI2014]方伯伯的商场之旅 思路 数位DP dalao说这是数位dp水题,果然是我太菜了... 自己是不可能想出来的.这道题在讲课时作为例题,大概听懂了思路,简单复述一 ...

  5. 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树

    洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...

  6. bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Sta ...

  7. bzoj 3594: [Scoi2014]方伯伯的玉米田

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1399  Solved: 627 [Submit][ ...

  8. 洛谷 P3285 [SCOI2014]方伯伯的OJ

    看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...

  9. 洛谷 P3285 - [SCOI2014]方伯伯的OJ(平衡树)

    洛谷题面传送门 在酒店写的,刚了一整晚终于调出来了-- 首先考虑当 \(n\) 比较小(\(10^5\) 级别)的时候怎么解决,我们考虑将所有用户按排名为关键字建立二叉排序树,我们同时再用一个 map ...

随机推荐

  1. Poetry(1)Poetry介绍与安装

    介绍 Poetry 是Python 中的依赖管理和打包工具,当然它也可以配置虚拟环境.它允许您声明项目所依赖的库,并为您管理(安装/更新)它们. 之前一直使用virtualenvwrapper管理虚拟 ...

  2. 【UE4 C++】 Datatable 读写、导入导出 CSV/Json

    Datatable 读取行数据 1. 创建结构体 继承自 FTableRowBase USTRUCT(BlueprintType) struct FSimpleStruct :public FTabl ...

  3. 第07课 OpenGL 光照和键盘(1)

    光照和键盘控制: 在这一课里,我们将添加光照和键盘控制,它让程序看起来更美观. 这一课我会教您如何使用三种不同的纹理滤波方式.教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的 ...

  4. python教程-(四)当索引行不通时(python字典)

    一.创建和使用字典 1.函数dict #字典表示方式如下 >>> phonebook = {'tom':'18616271234',"Jim":"186 ...

  5. 【数据结构&算法】05-线性表之数组

    目录 前言 线性结构与非线性结构 数组 数组的两个限制 数组的随机访问特性 数组的操作 插入操作 删除操作 数组越界 容器 数组下标 前言 本笔记主要记录数组的一些基础特性及操作. 顺便解答下为什么大 ...

  6. 【Python+postman接口自动化测试】(8)以青云客机聊天器人和图灵聊天机器人接口示范python发送get和post

    以青云客机器人和图灵机器人接口示范python发送get和post 发送请求,我们这里主要使用Python的一个第三方包(需要先安装):requests. Python3自带的http.client和 ...

  7. ES6遍历对象方法

    ES6 一共有 5 种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性). let obj = {a:1,b:2,c:3 ...

  8. vuex4 极速入门到上手

    vuex4 是 vue3的兼容版本,提供了和vuex3 的相同API.因此我们可以在 vue3 中复用之前已存在的 vuex 代码. 一.安装以及初始化 vuex4安装: npm install vu ...

  9. 大一C语言学习笔记(10)---编程篇--制作简易计算器,支持加,减,乘,除,取余运算,要求 0 bug

    博主自开学初就一直在努力为自己的未来寻找学习方向,学习编程嘛,尽量还是要抱大腿的,所以我就加入了我们学校的智能设备研究所,别的不说,那的学长们看起来是真的很靠谱,学长们的学习氛围也超级浓厚,所以我就打 ...

  10. Java学习(二十)

    今天学习了Java中的package和import 在包中写了一点作为练习 如果把Test02放到别的包,就需要import到别的包,就像这样,Test02在HelloWorld包 如果删掉impor ...