原题



题解

一道超级牛逼的背包变形,想通之后真的很简单,难点在于想到使用 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 ]的更多相关文章

  1. 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 因 ...

  2. 从0开始搭建精灵宝可梦的检测APP

    从0开始搭建精灵宝可梦的检测APP 本文为本人原创,转载请注明来源链接 环境要求 Tensorflow1.12.0 cuda 9.0 python3.6.10 Android Studio Anaco ...

  3. Java反射:new一个宝可梦吧

    最近写Spring Boot的测试用例会发现经常会有用到@RunWith(SpringRunner.class)的设置注解,关于SpringRunner.class的理解也有点似是而非.其实这种写法是 ...

  4. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  5. ZJNU 2135 - 小智的宝可梦

    因为成环 所以可以枚举第1只与第n只喂的次数 然后第1只和第2只的次数就固定了,以此类推,则所有宝可梦喂的次数都固定了 最后处理完检查是否全为0,不是则进行下一次枚举,是则直接输出Yes 如果所有枚举 ...

  6. ALGO-31_蓝桥杯_算法训练_开心的金明(DP)

    问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎 么布置,你说了算,只要不超过N元钱就行”.今 ...

  7. ALGO-13_蓝桥杯_算法训练_拦截导弹(贪心,DP)

    问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  8. 2018.12.31 NOIP训练 czy的后宫6(线性dp)

    传送门 题意简述:给一个nnn个数的数列,你可以把它最多分成mmm段,求每段数之和的最大值的最小值,以及满足这个最小值的时候划分数列的方案数. 思路:第一个问题是二分经典问题,不妨设其答案为limli ...

  9. 2018.11.06 NOIP训练 简单的计数问题(计数dp)

    传送门 直接f[i][j]f[i][j]f[i][j]表示已经到第iii个位置已经找到jjj个的方案数. 简单转移一下就行了. 代码

  10. 2018.11.01 NOIP训练 树的排列(树形dp)

    传送门 跟这道题差不多. 只不过是让权值小的儿子做权值大的儿子的父亲而已. 代码

随机推荐

  1. 使用PicGo存储markdown图片(阿里云或者github)

    PicGo代替极简图床 之前使用极简床图,但是后来好像挂了,真是一件悲伤的事,最近才发现了一个神器,开源的PicGo,已经有各个平台的版本了.链接如下:https://github.com/Molun ...

  2. 探索Matplotlib-Gallery:Python数据可视化的游乐园

    探索matplotlib-gallery:Python数据可视化的游乐园 在数据科学的世界里,数据可视化是一个不可或缺的工具,它帮助我们理解数据.发现模式.并传达信息.Matplotlib是Pytho ...

  3. 渗透测试-前端加密分析之AES

    前言 本文是高级前端加解密与验签实战的第3篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过前端 AES(CBC) 和 AES(ECB) 加密. 因为编写Yakit热 ...

  4. 【Amadeus原创】docker安装apache

    1, docker下载apache [root@it-1c2d webnav]# docker search apache [root@it-1c2d webnav]# docker pull htt ...

  5. 痞子衡嵌入式:MCUXpresso IDE下C++源文件中嵌套定义的复合数据类型命名空间认定

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下C++源文件中嵌套定义的复合数据类型命名空间认定. 痞子衡之前写过一篇文章 <MCUXpresso ...

  6. COS 数据工作流 + Serverless云函数自定义处理能力发布!

    01 背景 在工业4.0的浪潮下,智能和数据与物理世界结合越加紧密,多元化.灵活.高效的数据处理能力成为各行各业的热点需求. ​ 虽然COS已经预置电商.文创.教育.社交.安防等行业需要的基础数据处理 ...

  7. 中电金信:GienTech动态| 获奖、合作、与伙伴共谋数字化转型…

    ​ ​ -- -- GienTech动态 -- -- 中电金信携"源启"亮相第十二届中国电子信息博览会 ​ 4月11日,为期三天的"第十二届中国电子信息博览会" ...

  8. k8s备份恢复实践--velero

    k8s备份恢复实践--velero 使用Velero备份k8资源到minio,阿里云oss,七牛云Kodo 环境linux + kubectl #1.velero简介 Velero是用于Kuberne ...

  9. 黑苹果 - 搭建python自动化测试环境

    通用环境 1. 安装 xcode 从 AppStore 安装 安装完成之后,打开 xcode,同意各种协议 不用新建项目 注意: xcode下载完成后,安装的过程很慢,需要等待.我是12.5版本,差不 ...

  10. Gmssl编译问题: error while loading shared libraries: libssl.so.1.1: cannot open shared object file

    在Centos7上编译安装Gmssl后,运行gmssl version出现如下错误: gmssl: error while loading shared libraries: libssl.so.1. ...