多重背包,$q$ 次询问,每次问删一个物品之后花费 $x$ 能装多少物品

$n \leq 3000, x \leq 1000, q \leq 300000$

sol:

网上有很多假做法

正解应该是考虑分治

先二进制拆物品,然后记 $solve(l,r)$ 表示不考虑 $[l,r]$ 的操作的 dp

每次递归的时候先把 $[mid+1,r]$ 的 dp 数组搞出来,然后递归 $[l,mid]$,然后删除 $[mid+1,r]$

同样的,把 $[l,mid]$ 的 dp 数组搞出来,递归 $[mid+1,r]$ ,然后删除 $[l,mid]$

递归到 $[l,l]$ 的时候会确保只有 $[l,l]$ 区间没被算

这样每层实际上只跑了一次 dp,分治有 log 层,所以复杂度是 $O(n^2log^2n)$ (拆物品带一个 log,重量与 $n$ 同级)

单调队列可以少一个 log

#include<bits/stdc++.h>
#define LL long long
#define rep(i,s,t) for(register int i = (s),i##end = (t); i <= i##end; ++i)
#define dwn(i,s,t) for(register int i = (s),i##end = (t); i >= i##end; --i)
using namespace std;
inline int read()
{
int x=,f=;char ch;
for(ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')f=-f;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';
return x*f;
}
const int maxn = ;
vector<pair<int, int> > qs[maxn];
int n, dfn, curdep;
int a[maxn], b[maxn], lb[maxn], rb[maxn];
int ans[ * maxn], dp[], fzd;
void cdq(int l, int r) {
if(l == r) {
rep(i, , qs[l].size() - ) ans[qs[l][i].second] = dp[qs[l][i].first];
return;
}
int mid = (l + r) >> ;
int tmp[];
memcpy(tmp, dp, sizeof(tmp)); //fzd++;
rep(i, lb[mid+], rb[r]) dwn(j, , a[i]) dp[j] = max(dp[j], dp[j - a[i]] + b[i]);
cdq(l, mid);
memcpy(dp, tmp, sizeof(dp)); //fzd++;
rep(i, lb[l], rb[mid]) dwn(j, , a[i]) dp[j] = max(dp[j], dp[j - a[i]] + b[i]);
cdq(mid+, r);
memcpy(dp, tmp, sizeof(dp)); //fzd++;
}
int main()
{
n = read();
rep(i, , n) {
int u = read(), v = read(), w = read(), j;
lb[i] = dfn + ;
for(j=;(j<<)<=(w+);j<<=) dfn++, a[dfn] = u * j, b[dfn] = v * j;
if(w+-j>) dfn++, a[dfn] = (w+-j) * u, b[dfn] = (w+-j) * v;
rb[i] = dfn;
}
int q = read();
rep(i, , q) {
int x = read() + , y = read();
qs[x].push_back(make_pair(y, i));
}
cdq(, n);
rep(i, , q) printf("%d\n", ans[i]);
//if(fzd >= 3 * n) cout << "False" << endl;
}

bzoj3163 Eden的新背包问题的更多相关文章

  1. BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]

    3163: [Heoi2013]Eden的新背包问题 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 428  Solved: 277[Submit][ ...

  2. 【BZOJ】【3163】【HEOI2013】Eden的新背包问题

    多重背包/思路题 多次询问,每次从所有物品中忽略一件,问最大收益…… 这题我用的zyf的一个“暴力”做法,就是先预处理出来g1[i][j]表示1~i号物品花了j块钱的最大价值,g2[i][j]表示i~ ...

  3. BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )

    从左到右, 从右到左分别dp一次, 然后就可以回答询问了. ---------------------------------------------------------- #include< ...

  4. P4095 [HEOI2013]Eden 的新背包问题

    P4095 [HEOI2013]Eden 的新背包问题 题解 既然假定第 i 个物品不可以选,那么我们就设置两个数组 dpl[][] 正序选前i个物品,dpr[][] 倒序选前i个物品 ,价格不超过 ...

  5. luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并

    LINK:Eden 的新背包问题 就是一个多重背包 每次去掉一个物品 询问钱数为w所能买到的最大值. 可以对于每次Q暴力dp 利用单调队列优化多重背包 这样复杂度是Qnm的. 发现过不了n==10的点 ...

  6. bzoj3163: [Heoi2013]Eden的新背包问题

    Description “寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听.”失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她 ...

  7. 洛谷P4095||bzoj3163 [HEOI2013]Eden 的新背包问题

    https://www.luogu.org/problemnew/show/P4095 不太会.. 网上有神奇的做法: 第一种其实是暴力(复杂度3e8...)然而可以A.考虑多重背包,发现没有办法快速 ...

  8. DSY3163*Eden的新背包问题

    Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...

  9. bzoj 3163: [Heoi2013]Eden的新背包问题

    Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...

随机推荐

  1. 解释*args和**kwargs的含义

    当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组,我们就使用*args def func(*args): for i in args: print(i) func(3,2,1,4,7) ...

  2. 每天一个Linux命令(64)shutdown命令

        shutdown以一种安全的方式关闭系统.     (1)用法:     用法:  shutdown [参数] [时间]     (2)功能:     功能:  系统关机命令,shutdown ...

  3. sudoers文件设置sudo命令无密码(root密码)登录

    参考博客:http://xvshell.iteye.com/blog/1838093 1. 当用户执行sudo时,Linux系统会去寻找/etc/sudoers文件,并且这是主动的,判断用户是否有执行 ...

  4. 定制AIX操作系统的shell环境

    操作系统与外部最主要的接口就叫做shell.shell是操作系统最外面的一层.shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果. shel ...

  5. 【Tech】CAS RESTful API使用笔记

    在被maven,cas,tomcat各种贱人就是矫情的虐了好几天之后,终于跑通了demo,哈哈哈哈哈哈哈~ 在这里详细记录一下,给和我一样连maven都不会的小白一点福利,同时欢迎大神指正. 首先上最 ...

  6. 解决Ubuntun 12.04编译Mesa10.3 WARNING: 'aclocal-1.14' is missing on your system

    安 装Mesa时,最后一个错误报“WARNING: 'aclocal-1.14' is missing on your system.”,虽然是个Warning,但是无法进行下一步make,所以必须解 ...

  7. 黑色CSS3立体动画菜单

    在线演示 本地下载

  8. linux 安装tomcat7

    wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.81/bin/apache-tomcat-7.0.81.tar.gz 解压安装包 t ...

  9. RequestMapping请求映射方式

    1.标准映射 规则: 1) @RequestMapping可以设置在类上,也可以设置在方法上 2) 请求的映射规则是:类上的RequestMapping + 方法上的RequestMapping 3) ...

  10. Linux查看文件编码格式及文件编码转换<转>

    如果你需要在Linux 中操作windows下的文件 ,那么你可能会经常遇到文件 编码 转换的问题.Windows中默认的文件 格式是GBK(gb2312),而Linux 一般都是UTF-8.下面介绍 ...