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

题目链接: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. drop table 命令不回收以前的相关访问权限

    drop table 命令不回收以前的相关访问权限,也就是说假如我现在把表删除了,然后再创建一个同名的表时,会自动赋予权限的.

  2. pandas DataFrame的新增行列,修改、删除、筛选、判断元素以及转置操作

    1)指定行索引和列索引标签 index 属性可以指定 DataFrame 结构中的索引数组,  columns 属性可以指定包含列名称的行, 而使用 name 属性,通过对一个 DataFrame 实 ...

  3. 深入研究.NET 5的开放式遥测

    OpenTelemetry 介绍 OpenTelemetry是一种开放的源代码规范,工具和SDK,用于检测,生成,收集和导出遥测数据(指标,日志和跟踪),开放遥测技术得到了Cloud Native C ...

  4. APM调用链产品对比

    APM调用链产品对比 随着企业经营规模的扩大,以及对内快速诊断效率和对外SLA(服务品质协议,service-level agreement)的追求,对于业务系统的掌控度的要求越来越高,主要体现在: ...

  5. 如何在C#中使用MSMQ

    MSMQ (Microsoft消息队列)是Windows中默认可用的消息队列.作为跨计算机系统发送和接收消息的可靠方法,MSMQ提供了一个可伸缩.线程安全.简单和使用方便的队列,同时为你提供了在Win ...

  6. JAVA高并发集合详解

    Queue(队列)主要是为了高并发准备的容器Deque:双端队列,可以反方向装或者取 最开始jdk1.0只有Vector和hashtable 默认所有方法都实现了synchronized锁,线程安全但 ...

  7. Why failover-based implementations are not enough Redis分布式锁实现 SET resource_name my_random_value NX PX 30000

    核心 SET resource_name my_random_value NX PX 30000 Distributed locks with Redis – Redis https://redis. ...

  8. socket创建和结束

    什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体: ...

  9. 线性DP总结(studying

    写在前面 虽然都说线性DP是入门,但我还是今天才开始学 线性DP就是珂以通过线性处理得出答案的一种DP 每一种状态都可以从前面推得,并且推导过程是呈线性的 参考题单(本人现在主要用luogu,所以这些 ...

  10. URL重定向漏洞解析

    参考文章 悟空云课堂 | 第二期:URL重定向(跳转)漏洞 CWE-601: URL Redirection to Untrusted Site ('Open Redirect') 分享几个绕过URL ...