【ybt金牌导航1-2-5】【luogu P3287】优美玉米 / 方伯伯的玉米田
优美玉米 / 方伯伯的玉米田
题目链接: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】优美玉米 / 方伯伯的玉米田的更多相关文章
- 【ybt金牌导航1-2-6】【luogu P2467】地精部落
地精部落 题目链接:ybt金牌导航1-2-6 / luogu P2467 题目大意 有一个排列,要使得每个位置要么都比两边高,要么比两边低. 而且一定要以一高一低的方式排列. 两边的只用比旁边的那个高 ...
- 【ybt金牌导航1-2-4】免费馅饼
免费馅饼 题目链接:ybt金牌导航1-2-4 题目大意 有一个直线,在某一个时刻有一个馅饼会出现在一些位置,有它的价值. 一个人一开始可以站在直线的任意地方,然后他每个时刻可以不移动,或向任意一边移动 ...
- 【ybt金牌导航1-2-3】折线统计
折线统计 题目链接:ybt金牌导航1-2-3 题目大意 在一个图上有一些点,保证任意两个点的横纵坐标都不相同. 要你选一些集合,按 x 坐标排序依次连接,会构成一些连续上升下降的折线,问你折线数量是 ...
- 【题解】金牌导航-高斯消元/Luogu P3232 游走
题目描述: 详细分析: 我们对于编号的分配,很明显可以发现如下的分配就是期望最小的:对经过的期望次数越大的边赋予更小的编号. 那么问题就转化为了怎么求一条边的经过的期望次数,我们发现边数非常大所以肯定 ...
- 【题解】Luogu P3287 [SCOI2014]方伯伯的玉米田
原题传送门 一眼就能看出来这是一道dp题 显而易见每次操作的右端点一定是n,每株玉米被拔高的次数随位置不下降 用f(i,j) 表示以第i 株玉米结尾它被拔高了j 次的最长序列长度. \(f(i,j)= ...
- 洛谷P3287 [SCOI2014]方伯伯的玉米田(树状数组)
传送门 首先要发现,每一次选择拔高的区间都必须包含最右边的端点 为什么呢?因为如果拔高了一段区间,那么这段区间对于它的左边是更优的,对它的右边会更劣,所以我们每一次选的区间都得包含最右边的端点 我们枚 ...
- P3287 [SCOI2014]方伯伯的玉米田
首先可以证明,一定存在一种最优解,每次选择的区间结尾都是 \(n\).因为如果某一个区间结尾不是 \(n\),将其替换成 \(n\) 仍然保持单调不下降.接着都按这个策略拔高玉米. 令 \(f_{i, ...
- 洛谷 P3287 - [SCOI2014]方伯伯的玉米田(BIT 优化 DP)
洛谷题面传送门 怎么题解区全是 2log 的做法/jk,这里提供一种 1log 并且代码更短(bushi)的做法. 首先考虑对于一个序列 \(a\) 怎样计算将其变成单调不降的最小代价.对于这类涉及区 ...
- 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径
最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...
随机推荐
- 【转】Js中的window.parent ,window.top,window.self 详解
[转自]http://blog.csdn.net/zdwzzu2006/article/details/6047632 在应用有frameset或者iframe的页面时,parent是父窗口,top是 ...
- uni-app开发经验分享十: 封装request请求
http.js //封装requset,uploadFile和downloadFile请求,新增get和post请求方法 let http = { 'setBaseUrl': (url) => ...
- django之orm单表查询
这几天重新学习了一下django的orm,以此作为记录来分享. Part1:修改配置,生成表 在写数据和查数据之前,首先先得把django配置一下,具体配置如下: 1.先在公共项目的settings中 ...
- redis list 列表 查找 时间复杂度
http://redisbook.com/preview/intset/content.html 列表对象 列表对象的编码可以是 ziplist 或者 linkedlist . ziplistFind ...
- Defining Go Modules
research!rsc: Go & Versioning https://research.swtch.com/vgo shawn@a:~/gokit/tmp$ go get --helpu ...
- SpringMVC听课笔记(十:处理JSON: 使用HttpMessageConverter)
1. 处理JSON 2. 原理 流程图 3. 看个应用吧 -- 上传 ①jsp ②handler -- 下载 ① jsp ② handler
- java8 新特性---列表
- Kali-2020 配置Docker
Kali 2020 安装Docke 为什么在Kali上安装Docker? Kali有很多工具,但是您想运行一个不包含的工具,最干净的方法是通过Docker容器.例如,我正在研究一个名为vulhub的靶 ...
- java架构《并发线程基础二》
1.关键字 volatile 使用场景: 针对与多线程公用的数据 用volatile关键字修饰 但其不保证原子性(同步).volatile关键字不具备synchronized ...
- 20.LVM
1.在硬盘分好区或者部署为RAID 磁盘阵列之后,再想修改硬盘分区大小就不容易了.换句话说,当用户想要随着实际需求的变化调整硬盘分区的大小时,会受到硬盘"灵活性"的限制. 这时就需 ...