Hetao P1184 宝可梦训练家 [ 绿 ][ 背包dp ][ 线性dp ]


题解
一道超级牛逼的背包变形,想通之后真的很简单,难点在于想到使用 dp 并且用 dp 的值判断是否合法。
首先观察本题的数据范围:\(1\le n,q \le 10^5\) ,可知本题的询问要在 \(O(1) \text{~}O(\log n)\) 的时间里处理出来。
因此想到了二分或者预处理做法。
同时再来观察 \(k\) 的范围,\(1\le k \le 50\) ,这是个非常重要的切入点,同时把 \(a,l,r\) 的范围限制在 \(10^5+50\) 也是一个非常重要的条件。假设题目不需要利用这个条件,又为什么要将 \(k\) 限制在 \(50\) ,而不开到 \(10^9\) 呢?这就告诉我们题目的重点不在 \(n\) 上,重点是要计算每个宝可梦变成的值。
这样就可以直接排除二分区间应对询问的做法,因此直接考虑预处理。
分析
先考虑最简单的预处理方式:定义 \(f[i][j]\) 表示能否变成数字为 \([i,j]\) 的区间。
这种预处理方式不仅会 MLE ,而且会 TLE 。
但是我们也可以发现一个优化的点,那就是对于 \(f[i][j]=Yes\) 时,\(f[i+1][j] = Yes\) 。
同理,也可以说成是 \(f[i][j-1]=Yes\) ,只要换一种方式存储和写代码即可,这里采用上面的一种优化方案。
因此,我们用 \(f[j]\) 存储以数字 \(j\) 为结尾,最长能有的区间的长度 \(len\) ,那么此时的 \(i=j-len+1\)。所以当 $f[j] \ge j-i+1 $ 时,这个区间就可以得到($j-i+1 $ 是这个区间的长度),实际上,存储 \(i\) 来逆推 \(len\) 也不是不可以。
那么此时我们就只剩处理出 \(f[j]\) ,即以每个数字 \(j\) 结尾的 \(len\) 就行了。
建立模型
可以发现,\(f[j]\) 可以看成一个容量为 \(j\) 的背包,那么它的价值便是 \(len\) ,我们要使 \(len\) 最大化。并且由于每个宝可梦只能使用一次,所以这是个 01背包 。
所以设 $j=a[i]+v $ ,则 $ f[j]=f[j-1 ]+1$,其中 \(0\le v \le k\),即宝可梦的可以变换成的数。
这个方程的意义是:以 \(a[i]+v\) 为结尾时,最长的区间是从 以 \(a[i]+v-1\) 为结尾时最长区间的长度加了一个 \(1\) 得来的。
注意 01背包 的特殊转移方式,要让 \(v\) 从 \(k\) 到 \(0\) 转移,才能让使用了某个宝可梦的子集不包含也使用了这个宝可梦的子集。
唯一不同的是,背包加入物品是无序的,因为只要求 max 即可;但是这题加入是有序的,如果比它小的数没有更新完,而直接更新这个数,就会导致没有将这个状态分割成不遗漏也不重叠的子集,这是不行的。
因此,要先排个序再来给 \(f\) 更新。
时间 \(O(nk)\) 。
代码
#include <bits/stdc++.h>
using namespace std;
int f[100105],n,q,k,l,r,a[100005];
int main()
{
freopen("pokemon.in","r",stdin);
freopen("pokemon.out","w",stdout);
cin>>n>>k>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
for(int j=k;j>=0;j--)
{
f[a[i]+j]=f[a[i]+j-1]+1;
}
}
for(int i=1;i<=q;i++)
{
cin>>l>>r;
if(f[r]>=r-l+1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
Hetao P1184 宝可梦训练家 [ 绿 ][ 背包dp ][ 线性dp ]的更多相关文章
- 2018.10.19 NOIP训练 变化的序列(线性dp)
传送门 f[i][j]f[i][j]f[i][j]表示后iii个对答案贡献有jjj个a的方案数. 可以发现最后a,ba,ba,b的总个数一定是n∗(n−1)/2n*(n-1)/2n∗(n−1)/2 因 ...
- 从0开始搭建精灵宝可梦的检测APP
从0开始搭建精灵宝可梦的检测APP 本文为本人原创,转载请注明来源链接 环境要求 Tensorflow1.12.0 cuda 9.0 python3.6.10 Android Studio Anaco ...
- Java反射:new一个宝可梦吧
最近写Spring Boot的测试用例会发现经常会有用到@RunWith(SpringRunner.class)的设置注解,关于SpringRunner.class的理解也有点似是而非.其实这种写法是 ...
- HDU6578 2019HDU多校训练赛第一场 1001 (dp)
HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...
- ZJNU 2135 - 小智的宝可梦
因为成环 所以可以枚举第1只与第n只喂的次数 然后第1只和第2只的次数就固定了,以此类推,则所有宝可梦喂的次数都固定了 最后处理完检查是否全为0,不是则进行下一次枚举,是则直接输出Yes 如果所有枚举 ...
- ALGO-31_蓝桥杯_算法训练_开心的金明(DP)
问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎 么布置,你说了算,只要不超过N元钱就行”.今 ...
- ALGO-13_蓝桥杯_算法训练_拦截导弹(贪心,DP)
问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- 2018.12.31 NOIP训练 czy的后宫6(线性dp)
传送门 题意简述:给一个nnn个数的数列,你可以把它最多分成mmm段,求每段数之和的最大值的最小值,以及满足这个最小值的时候划分数列的方案数. 思路:第一个问题是二分经典问题,不妨设其答案为limli ...
- 2018.11.06 NOIP训练 简单的计数问题(计数dp)
传送门 直接f[i][j]f[i][j]f[i][j]表示已经到第iii个位置已经找到jjj个的方案数. 简单转移一下就行了. 代码
- 2018.11.01 NOIP训练 树的排列(树形dp)
传送门 跟这道题差不多. 只不过是让权值小的儿子做权值大的儿子的父亲而已. 代码
随机推荐
- 150页的剑指Offer解答PDF,它来了!!!
它来了!!! 终于整理出了第一版剑指Offer的PDF,主要以Java语言为主,一共67道题,100多页. 领取方式如下(无套路直接获取百度网盘的 链接,如果链接失效可以直接找我): [秦怀杂货店]公 ...
- Vue.js 文本行滚动
1.前言 文本行滚动组件,效果如图 2.封装思路 封装一个组件,接收一个数组,每个数组元素就是一个段文本 组件使用httpVueLoader进行封装加载 使用css位移,配合过渡效果才展示动画 滚动逻 ...
- 编写bash脚本快速kill或启动tomcat
假设tomcat安装路径为 /home/tomcat,示例如下: 1. kill tomcat进程 vim kill-tomcat-force.sh set fileformat=unix path ...
- 【Python】【Flask】【字符串索引】计算人民币与美元的相互计算
目录 简介 Python Code 导包 设置首页 计算的接口 问题0:设置请求方式 问题1:关于接收数据可能存在的问题 问题2:返回结果 启动 完整代码 HTML Code 问题分析 分析:获取下拉 ...
- Spring Boot中通过RabbitTemplate主动pull(get)消息的例子
import java.util.Properties; import java.util.function.Consumer; import org.slf4j.Logger; import org ...
- C# 读取本地的TXT文件内容
using (StreamReader streamReader = new StreamReader("C:\\Users\\zhang\\Desktop\\新建文件夹\\远程开关.txt ...
- [转]Linux系统下的GCC编译过程、使用命令详解(多文件编译、动态库、静态库)
Linux系统下的GCC编译过程.使用命令详解(多文件编译.动态库.静态库) [Linux]gcc简介+编译过程 翻译 搜索 复制
- error C2589: “(”:“::”右边的非法标记错误的处理
问题:error C2589: "(":"::"右边的非法标记错误的处理 标准库在<algorithm>头中定义了两个模板函数std::min() ...
- Idea中@Autowired 黄色波浪线问题以及注入类显示红色波浪线问题解决
解决办法: 点开路径:File--->Settings--->Editor--->Inspections--->Spring--->Spring core--->C ...
- SpringBoot 集成Swagger后提通过http://localhost:8001/swagger-ui.html#/访问得不到页面
SpringBoot 集成Swagger后提通过http://localhost:8001/swagger-ui.html#/访问得不到页面: spring boot 集成 swagger2步骤: ...