优美玉米 / 方伯伯的玉米田

题目链接:ybt金牌导航1-2-5 / luogu P3287

题目大意

有一个数组,你可以每次给一个区间里面的值加一,要你使得最后剩下的最长单调不下降子序列最长。

思路

首先, 我们会发现一个东西,就是选的区间的右端点一定是 \(n\)(也就是最右边)。

为什么呢?

因为你要构成最长不下降子序列,那就是要让右边更大,那既然要加区间,如果不移动到最右边,反而可能使得原来构成最长不下降子序列的地方被破坏,从而不是更优。

我们考虑弄出最朴素的方程,设 \(f_{i,j}\) 为 \(i\sim n\) 区间加 \(j\) 次在 \(1\sim n\) 能有的最长单调不下降子序列。

\(f_{i,j}=\max\limits_{l<i,j\leq m,a_i+j\geq a_l+m}{f_{l,m}}+1\)

那它有三个约束的条件,而且你枚举是 \(O(n^2k^2)\) 很明显超的很离谱。

那我们想到两个约束的条件可以用树状数组,那三个呢?

那我们考虑二维树状数组。

就是枚举两个,都 \(+\text{lowbit(i)}\) 或 \(-\text{lowbit(i)}\)。

那我们就从小到大枚举 \(f_i,j\) 的 \(i\) 以满足第一个条件,当然你还要枚举 \(j\)。因为你有可能搞查询的时候查询到了你当前枚举的 \(i\) 的地方,那你为了不会碰到,就可以从大到小枚举 \(j\)。剩下两个就树状数组来弄,但是因为树状数组不能搞 \(0\),但是你的 \(j\) 会有 \(0\),那你就需要把所有的 \(j\) 都加一。

然后就是正常的树状数组操作,答案就在枚举 \(i,j\),算出 \(f_{i,j}\) 的时候,找到所有的最大值。

代码

#include<cstdio>
#include<iostream> using namespace std; int n, k, ans, now, tree[6001][502], re, a[1000001]; void build(int x, int y, int num) {//二维树状数组操作
for (int nowx = x; nowx <= 6000; nowx += nowx & (-nowx))
for (int nowy = y; nowy <= k + 1; nowy += nowy & (-nowy))
tree[nowx][nowy] = max(tree[nowx][nowy], num);
} int ask(int x, int y) {
re = 0;
for (int nowx = x; nowx; nowx -= nowx & (-nowx))
for (int nowy = y; nowy; nowy -= nowy & (-nowy))
re = max(re, tree[nowx][nowy]);
return re;
} int main() {
scanf("%d %d", &n, &k);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++)//看现在加哪里
for (int j = k; j >= 0; j--) {//看加了多少
now = ask(j + a[i], j + 1) + 1;
ans = max(ans, now);
build(j + a[i], j + 1, now);//第二维全部加一,不然弄不了j=0的
} printf("%d", ans); return 0;
}

【ybt金牌导航1-2-5】【luogu P3287】优美玉米 / 方伯伯的玉米田的更多相关文章

  1. 【ybt金牌导航1-2-6】【luogu P2467】地精部落

    地精部落 题目链接:ybt金牌导航1-2-6 / luogu P2467 题目大意 有一个排列,要使得每个位置要么都比两边高,要么比两边低. 而且一定要以一高一低的方式排列. 两边的只用比旁边的那个高 ...

  2. 【ybt金牌导航1-2-4】免费馅饼

    免费馅饼 题目链接:ybt金牌导航1-2-4 题目大意 有一个直线,在某一个时刻有一个馅饼会出现在一些位置,有它的价值. 一个人一开始可以站在直线的任意地方,然后他每个时刻可以不移动,或向任意一边移动 ...

  3. 【ybt金牌导航1-2-3】折线统计

    折线统计 题目链接:ybt金牌导航1-2-3 题目大意 在一个图上有一些点,保证任意两个点的横纵坐标都不相同. 要你选一些集合,按 x 坐标排序依次连接,会构成一些连续上升下降的折线,问你折线数量是 ...

  4. 【题解】金牌导航-高斯消元/Luogu P3232 游走

    题目描述: 详细分析: 我们对于编号的分配,很明显可以发现如下的分配就是期望最小的:对经过的期望次数越大的边赋予更小的编号. 那么问题就转化为了怎么求一条边的经过的期望次数,我们发现边数非常大所以肯定 ...

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

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

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

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

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

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

  8. 洛谷 P3287 - [SCOI2014]方伯伯的玉米田(BIT 优化 DP)

    洛谷题面传送门 怎么题解区全是 2log 的做法/jk,这里提供一种 1log 并且代码更短(bushi)的做法. 首先考虑对于一个序列 \(a\) 怎样计算将其变成单调不降的最小代价.对于这类涉及区 ...

  9. 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径

    最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...

随机推荐

  1. Java设计模式精讲之UML急速入门

    简单记录 - 慕课网 - Java设计模式精讲 Debug方式+内存分析 文章目录 第2章 UML急速入门 2-1.UML简单入门 UML定义 UML特点 UML 2.2分类 UML类图 理解泛化.实 ...

  2. RocketMQ—消息队列入门

    消息队列功能介绍 字面上说的消息队列是数据结构中"先进先出"的一种数据结构,但是如果要求消除单点故障,保证消息传输可靠性,应对大流量的冲击,对消息队列的要求就很高了.现在互联网的& ...

  3. Spring Bean详解

    Spring Bean 在Spring的应用中,Spring IoC容器可以创建.装配和配置应用组件对象,这里的组件对象称为Bean. Bean的配置 Spring可以看作一个大型工厂,用于生产和管理 ...

  4. 每月一更的《HelloGitHub》第 58 期,来啦!

    HelloGitHub 分享 GitHub 上有趣.入门级的开源项目.欢迎大家: 贡献代码 宣传你觉得优秀的项目 Star 项目️ 本月刊是每月 28 号更新,再见月刊就是年后了.在这里提前祝大家:新 ...

  5. Power of Two Choices 负载均衡

    NGINX and the "Power of Two Choices" Load-Balancing Algorithm - NGINX https://www.nginx.co ...

  6. Map类型数据导出Excel--poi

    https://blog.csdn.net/KevinChen2019/article/details/101064790 <dependency> <groupId>org. ...

  7. Routine Subroutine Coroutine 子程序 协程 子例程

    https://en.wikipedia.org/wiki/Subroutine In computer programming, a subroutine is a sequence of prog ...

  8. 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改

    来源连接   http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...

  9. promise有几种状态,什么时候会进入catch

    三个状态:pending.fulfilled.reject两个过程:padding -> fulfilled.padding -> rejected当pending为rejectd时,会进 ...

  10. UserControl和CustomControl两者区别

    UserControl 将多个WPF控件(例如:TextBox,TextBlock,Button)进行组合成一个可复用的控件组: 由XAML和Code Behind代码组成: 不支持样式/模板重写: ...