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)
传送门 跟这道题差不多. 只不过是让权值小的儿子做权值大的儿子的父亲而已. 代码
随机推荐
- Java基础 —— 反射
动态语言 动态语言,是指程序在运行时可以改变其结构(新函数可以引进,已有的函数可以被删除等结构上的变化).如:JavaScript.Python就属于动态语言,而C.C++则不属于动态语言,从反射的 ...
- sql 依据时间间隔分组,获取第一条数据
时序数据的数据量比较大,抛去异常点外,变化相对比较有线性规律,业务上需要对结果进行抽取显示. 原始数据时序标签(部分示例) 根据时间字段,计算时间字段和指定时间的时间戳差值,然后除以固定间隔(示例中间 ...
- Element Plus组件v-loading在el-dialog组件上使用无效
前情 公司有经常需要做一些后台管理页面,我们选择了Element Plus,它是基于 Vue 3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个 Vu ...
- 配置 Forwarded Headers Middleware
来自微软的说明:Configure ASP.NET Core to work with proxy servers and load balancers | Microsoft Learn. 通过该中 ...
- 体验.NET与文件存储服务MinIO
对象文件存储服务(OSS)主要用于存储零散的文件,和直接存储到本地文件系统中相比,有以下的几个优势: 跨服务器可用 兼容Amazon S3 API 横向扩容 高可用 支持加密 MinIO就是一个高性能 ...
- Rocky Linux8升级9随记
发现Rocky Linux已经升级了9.0版本,看着自己用着的8.5版本,跃跃欲试,于是就索性升级了.两者的支持年限没有太大的差别,先说我的想法:升不升级无所谓. 并不是9.0有什么特别牛的特性,只是 ...
- 黑苹果(Hackintosh) - 安装1:用 VMware pro 16 安装 Big Sur 11.6
1. 背景情况 1.1 想法 想要体验体验macOS系统,不想花钱买 Macbook,就想着 装一个黑苹果体验下. 1.2 本机基本情况 笔记本:zx6 cp5s1 CPU:i5 8400 主板:H3 ...
- Qt编写地图综合应用51-离线瓦片地图下载
一.前言 写这个离线地图下载器的初衷,就是为了方便自己的几个需要离线地图的程序,客户需求,既然地图程序已经可以支持离线地图,那如何获取到这些离线瓦片地图文件是个关键,而且这是这个功能的关键,拿到这些一 ...
- [转]快速搭建简单的LBS程序——地图服务
很多时候,我们的程序需要提供需要搭建基于位置的服务(LBS),本文这里简单的介绍一下其涉及的一些基本知识. 墨卡托投影 地图本身是一个三维图像,但在电脑上展示时,往往需要将其转换为二维的平面图形,需要 ...
- [转]C# Winform 跨线程更新UI控件常用方法汇总
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...