BZOJ3163: [Heoi2013]Eden的新背包问题

这篇博客介绍了如何解决BZOJ3163题目中涉及的经典背包问题,通过CDQ分治策略,详细阐述了解决思路。博主指出,在solve(l,r)过程中,分别用(mid+1,r)和(l,mid)的物品更新背包,并在递归边界更新答案。同时,为保持复杂度在O(nlognM),需要应用单调队列优化多重背包。博客中还对一些网上题解的高复杂度做法进行了批评。" 78761481,5616942,多线程猜数字游戏:随机数与猜测交互,"['多线程开发', '并发编程', '游戏开发', '编程挑战', 'Java编程']
摘要由CSDN通过智能技术生成

感觉这个题已经变成经典题了…
考虑CDQ分治,solve(l,r)表示删掉[l,r]这段区间的物品后的背包数组,那么solve(l,mid)这个背包数组一定包含(mid+1,r)里的所有物品,所以只需用(mid+1,r)这些物品更新solve(l,r)这个背包后传入solve(l,mid)即可。 solve(mid+1,r)时同理,用(l,mid)的物品更新solve(l,r)这个背包,然后传入solve(mid+1,r)即可。
在递归边界solve(l,l)的时候更新答案。
复杂度:T(n)=2T(n/2)+O(nM)≈O(nlognM)
为了保证复杂度,需要单调队列优化下多重背包…
(顺便吐槽下网上的题解怎么都是正着做一遍背包反着做一遍背包然后合并,这复杂度3E啊…数据水就过了…)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
//by:MirrorGray
using namespace std;
const int N=611111,V=2111;
int dp[15][V],ans[N];
int c[N],limit[N],w[N];
int tot=-1,head[N],nxt[N],pos[N],money[N];
struct queue{
    int pos,val;
    queue(int a=0
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值