高级的暴力,神仙优化……

首先$O(n^{3})$的$dp$很好想,然后这样可以$O(1)$地回答询问。

考虑到所有物品的体积是一个连续的区间,所以说我们可以合并一些物品来达到预处理时间均摊的效果。

我们知道$k = pm + q$表示一个带余除法,那么我们对于每一个$k$,考虑枚举物品的体积$v$然后选取一个适当的模数$m$来优化计算。

对于每一个询问$ans = max(f_{pm, i}, f_{q, v - i})   ( 0 \leq i \leq v)$

这样的话我们预处理$f_{0,1,2,...,m}$和$f_{m, 2m, 3m, ..., km}  (n \leq km)$就可以回答问题了。

根据分块的思想当$m = \sqrt{n}$时,合并后的物品的数量是根号级别的,这样预处理的时间复杂度是$O(n ^ {2.5})$较优,回答每一个询问的时间是$O(n)$,可以通过本题。

还有一个小细节就是要注意当$q$取1时其实答案只能取$f_{q, v}$,但是找答案的过程中可能会出现$f_{q, i} (i < v)$比答案大的情况,所以我们将$f$先全部标记为不合法状态,然后记$f_{0, 0} = 0$为合法状态,就可以避免中间项答案的干扰。

膜Claris。

Code:

#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std; const int N = ;
const int M = ;
const int inf = << ; int n, m, qn, w[N], f[M][N], g[M][N]; inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} int main() {
memset(f, , sizeof(f));
memset(g, , sizeof(g)); read(n), read(qn);
m = sqrt(n) + ;
for(int i = ; i <= n; i++) {
read(w[i]);
f[][i] = w[i];
} for(int i = ; i <= m; i++)
for(int j = ; j <= n; j++)
for(int k = ; k <= j; k++)
chkMax(f[i][j], f[i - ][k] + w[j - k]); g[][] = f[][] = ;
for(int i = ; i <= n; i++)
g[][i] = f[m][i]; for(int i = ; i <= m; i++)
for(int j = ; j <= n; j++)
for(int k = ; k <= j; k++)
chkMax(g[i][j], g[i - ][k] + f[m][j - k]); for(int k, v, a, b, ans; qn--; ) {
read(k), read(v);
ans = -inf, a = k / m, b = k % m;
for(int i = ; i <= v; i++)
chkMax(ans, f[b][i] + g[a][v - i]);
printf("%d\n", ans);
} return ;
}

WOJ 46 完全背包的更多相关文章

  1. woj1005-holding animals-01pack woj1006-Language of animals-BFS

    title: woj1005-holding animals-01pack date: 2020-03-05 categories: acm tags: [acm,woj,pack] 01背包.中等题 ...

  2. Euro Efficiency_完全背包

    Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...

  3. Euro Efficiency(完全背包)

    Euro Efficiency Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) Tot ...

  4. hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)

    HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包 ...

  5. 0-1背包 VIOJ1025

    P1025小飞侠的游园方案 请 登录 后递交 标签:[显示标签] 描述 菜虫:你的题目是--我们的情报组织探听到敌人的重要将领--小飞侠星期天会邀他的灵儿妹妹到公园去玩.公园里有很多娱乐项目,可并不是 ...

  6. POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)

    Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...

  7. 【转载】 HDU 动态规划46题【只提供思路与状态转移方程】

    1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包;第一次做的时候把概率当做背包(放大100000倍化为整数) ...

  8. 「NOIP2006」「LuoguP1064」 金明的预算方案(分组背包

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

  9. HDU 6125 Free from square (状压DP+分组背包)

    题目大意:让你在1~n中选择不多于k个数(n,k<=500),保证它们的乘积不能被平方数整除.求选择的方案数 因为质数的平方在500以内的只有8个,所以我们考虑状压 先找出在n以内所有平方数小于 ...

随机推荐

  1. GCD多线程的使用

    转载自http://blog.csdn.net/nono_love_lilith/article/details/7829557 写得非常好 1.下面来看下如何使用gcd编程的异步 dispatch_ ...

  2. HihoCoder1080 更为复杂的买卖房屋姿势(线段树+多重lazy)

    描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们可以化身上帝模式,买卖房产. 在这个游戏里,会不断的发生如下两种事件:一种是房屋自发的涨价或者降价,而另一种是政 ...

  3. C#进阶之路(六):表达式进行类的赋值

    好久没更新这个系列了,最近看.NET CORE源码的时候,发现他的依赖注入模块的很多地方用了表达式拼接实现的.比如如下代码 private Expression<Func<ServiceP ...

  4. [ Laravel 5.5 文档 ] 数据库操作 —— 在 Laravel 中轻松实现分页功能

     简介 在其他框架中,分页是件非常痛苦的事,Laravel 让这件事变得简单易于上手.Laravel 的分页器与查询构建器和 Eloquent ORM 集成在一起,并开箱提供方便的.易于使用的.基于 ...

  5. ERR_PTR PTR_ERR IS_ERR ERROR

    在linux-x.xx/include/uapi/asm-generic/errno-base.h和errno.h里分别定义了返回错误的信息. errno-base.h: #ifndef _ASM_G ...

  6. 使用ajax技术实现简单登录操作

    1.ajax:特点在web上面通过JavaScript,使用异步的XmlHttp请求,实现无刷新的Web界面 首先:创建ajax对象 再次:向服务器端实现ajax请求 最后:回调 创建异步请求对象 & ...

  7. Azure VM从ASM迁移到ARM(一)

    Azure的IaaS有ASM和ARM两个版本,ARM的一些优点前面已经聊过很多了.ARM有更细的管理颗粒度,更多的功能等. 如果想从ASM迁移到ARM,目前有两类方法可以实现: 1. Azure平台支 ...

  8. LdapContext获取对象的属性

    //            dn = "cn=1,cn=Users,DC=域名,DC=COM";//            Attributes answer = ctx.getA ...

  9. php大型网站如何提高性能和并发访问

    一.大型网站性能提高策略: 大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器.高性能的数据库.高效率的编程语言.还有高性能的Web容器. ...

  10. JavaScript组合设模式--改进上述引入的例子

    对于组合设计模式: (1)组合模式中把对象分为两种(组合对象,和叶子对象) (2)组合对象和叶子对象实现:同一批操作 (3)对组合对象执行的操作可以向下传递到叶子节点进行操作 (4)这样就会弱化类与类 ...