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

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 428  Solved: 277
[Submit][Status][Discuss]

Description

“寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听。”
失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她的音容笑貌。 记忆中,她总是喜欢给Eden出谜题:在 valentine’s day 的夜晚,两人在闹市中闲逛时,望着礼品店里精巧玲珑的各式玩偶,她突发奇想,问了 Eden这样的一个问题:有n个玩偶,每个玩偶有对应的价值、价钱,每个玩偶都可以被买有限次,在携带的价钱m固定的情况下,如何选择买哪些玩偶以及每个玩偶买多少个,才能使得选择的玩偶总价钱不超过m,且价值和最大。众所周知的,这是一个很经典的多重背包问题,Eden很快解决了,不过她似乎因为自己的问题被飞快解决感到了一丝不高兴,于是她希望把问题加难:多次 询问,每次询问都将给出新的总价钱,并且会去掉某个玩偶(即这个玩偶不能被选择),再问此时的多重背包的答案(即前一段所叙述的问题)。  
这下Eden 犯难了,不过Eden不希望自己被难住,你能帮帮他么?

Input

第一行一个数n,表示有n个玩偶,玩偶从0开始编号 
第二行开始后面的 n行,每行三个数 ai, bi, c i,分别表示买一个第i个玩偶需
要的价钱,获得的价值以及第i个玩偶的限购次数。 
接下来的一行为q,表示询问次数。 
接下来q行,每行两个数di. ei表示每个询问去掉的是哪个玩偶(注意玩偶从0开始编号)以及该询问对应的新的总价钱数。(去掉操作不保留,即不同询问互相独立)

Output

输出q行,第i行输出对于第 i个询问的答案。

Sample Input

5
2 3 4
1 2 1
4 1 2
2 1 1
3 2 3
5
1 10
2 7
3 4
4 8
0 5

Sample Output

13
11
6
12
4

HINT

一共五种玩偶,分别的价钱价值和限购次数为 (2,3,4), (1,2,1), (4,1,2), (2,1,1),(3,2,3)。五个询问,以第一个询问为例。第一个询问表示的是去掉编号为1的玩偶,且拥有的钱数为10时可以获得的最大价值,则此时剩余玩偶为(2,3,4),(4,1,2),(2,1,1),(3,2,3),若把编号为0的玩偶买4个(即全买了),然后编号为3的玩偶买一个,则刚好把10元全部花完,且总价值为13。可以证明没有更优的方案了。注意买某种玩偶不一定要买光。

100. 数据满足1 ≤ n ≤ 1000, 1 ≤ q ≤ 3*105 , 1 ≤  a

i、bi、c i ≤ 100, 0 ≤ d i < n,  0  ≤ei ≤ 1000。

Source

1

直接做完全背包显然不行。
考虑分治。
Solve(l,r)表示,当前维护的dp数组,记录的答案是除去[l,r]外的物品的答案。
Solve(l,mid)时,用[mid+1,r]内的物品转移dp数组。
当l=r时,将所有ban=l=r的询问一起(查dp数组)求答案。
时间复杂度O(nwlogn)
 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline void read(int &x){
register char ch=getchar();x=;
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
}
const int N=;
const int M=1e6+;
struct things{int wei,val,t;}d[N];
int n,m,p,q[M],ban[M],lim[M],ans[M];
int dp[][N];
inline bool cmp(const int &x,const int &y){return ban[x]<ban[y];}
//多重背包(用余数搞单调队列优化)
//一个很好的解释:http://blog.csdn.net/qiusuo800/article/details/8820905
inline void trans(int *f,int wei,int val,int t){
pair<int,int>q[N];
for(int b=;b<wei;b++){
int qh=,qt=,now;
for(int j=;(now=b+j*wei)<;j++){
for(;qh<=qt&&q[qt].second<=f[now]-j*val;qt--);
for(;qh<=qt&&j-q[qh].first>t;qh++);
q[++qt]=make_pair(j,f[now]-j*val);
f[now]=q[qh].second+j*val;
}
}
}
void solve(int l,int r,int dep){
if(l==r){
for(;p<=m&&ban[q[p]]==l;p++) ans[q[p]]=dp[dep][lim[q[p]]];
return ;
}
int mid=(l+r)>>;
memcpy(dp[dep+],dp[dep],sizeof dp[dep]);
for(int i=mid+;i<=r;i++) trans(dp[dep+],d[i].wei,d[i].val,d[i].t);
solve(l,mid,dep+);
memcpy(dp[dep+],dp[dep],sizeof dp[dep]);
for(int i=l;i<=mid;i++) trans(dp[dep+],d[i].wei,d[i].val,d[i].t);
solve(mid+,r,dep+);
}
int main(){
read(n);
for(int i=;i<=n;i++) read(d[i].wei),read(d[i].val),read(d[i].t);
read(m);
for(int i=;i<=m;i++) read(ban[i]),read(lim[i]),ban[i]++,q[i]=i;
stable_sort(q+,q+m+,cmp);p=;
// memset(dp[0],0,sizeof dp[0]);
solve(,n,);
for(int i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}

UPD.2

/*
离线预处理:多重背包正扫一遍,反扫一遍
ans=max(f[k1][j]+f_rev[k1+2][t1-j]){0<=j<=t1}
attention:
习惯了一维的二进制拆分,二维的多重背包居然不会了~~
*/
#include<cstdio>
#include<iostream>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int N=;
int n,m,v[N],w[N],c[N],f[N][N],f_rev[N][N];
void pre_deal(){
for(int i=,tmp;i<=n;i++){
tmp=c[i];
for(int j=;j<=;j++) f[i][j]=f[i-][j];
for(int j=;tmp!=;j<<=){
j=min(j,tmp);
tmp-=j;
for(int k=;k>=j*v[i];k--){
f[i][k]=max(f[i][k],f[i][k-j*v[i]]+j*w[i]);
}
}
}
for(int i=n,tmp;i>=;i--){
tmp=c[i];
for(int j=;j<=;j++) f_rev[i][j]=f_rev[i+][j];
for(int j=;tmp!=;j<<=){
j=min(j,tmp);
tmp-=j;
for(int k=;k>=j*v[i];k--){
f_rev[i][k]=max(f_rev[i][k],f_rev[i][k-j*v[i]]+j*w[i]);
}
}
}
}
int main(){
n=read();
for(int i=;i<=n;i++) v[i]=read(),w[i]=read(),c[i]=read();
pre_deal();
m=read();
for(int k1,t1,ans;m--;){
k1=read();t1=read();ans=;
for(int j=;j<=t1;j++) ans=max(ans,f[k1][j]+f_rev[k1+][t1-j]);
printf("%d\n",ans);
}
return ;
}

BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    题目描述 " 寄 没 有 地 址 的 信 ,这 样 的 情 绪 有 种 距 离 ,你 放 着 谁 的 歌 曲 ,是 怎 样 的 心 情 . 能 不 能 说 给 我 听 ." 失忆的 ...

  9. 题解——洛谷P4095 [HEOI2013]Eden 的新背包问题(背包)

    思路很妙的背包 用了一些前缀和的思想 去掉了一个物品,我们可以从前i-1个和后i+1个推出答案 奇妙的思路 #include <cstdio> #include <algorithm ...

随机推荐

  1. unity3d Start执行不同时问题

    1.一个Scene的场景里有许多的GameObject,很多GameObject上绑定了Script,每个Script上又都有Start函数 using UnityEngine; using Syst ...

  2. JSP内置对象—session

    什么是session? session对象是用来在每个用户之间分别保存每个用户信息的对象,以便跟踪用户的操作状态.session的信息保存在server端,session的id保存在client的co ...

  3. LinuxMint下的Orionode源码安装

    1. Orionode介绍 Eclipse-orion是Eclipse项目下面的一个子项目,orion是一个在在线版的代码编辑环境.其介绍参考http://wiki.eclipse.org/Orion ...

  4. Mac OS终端中设置颜色高亮和自动补全

    已测试通过,原文:http://blog.csdn.net/songjinshi/article/details/8945809 一.颜色高亮显示 针对terminal采用bash模式: 编辑 ~/. ...

  5. linux下.so、.ko、.a的区别

    各类文件的区别与作用: 1.对于.so文件 .so文件是用户层的动态链接库,用于用户层的动态链接使用,内核态的代码同样不能直接访问. 2.对于.ko文件 .ko文件是内核态的动态链接库,用于内核态的动 ...

  6. Linux静态库生成

    Linux上的静态库,其实是目标文件的归档文件. 在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生成静态库. 配合静态库,写一 ...

  7. Explore Basic Behavior of the TurtleBot ---3

    原创博文:转载请标明出处(周学伟):http://www.cnblogs.com/zxouxuewei/tag/ Introduction 此示例帮助您使用turtlebot的自主性. 驱动机器人向前 ...

  8. Laravel5.1 填充数据库

    当我们创建好表结构后 通常都要生成一些测试用的数据来测试,应对这个场景呢 Laravel提供了相当好的服务 --seed Laravel的seeder都会放在:/database/seeders 目录 ...

  9. C# winform开发嵌套Chrome内核浏览器(WebKit.net)开发(一)

    https://www.cnblogs.com/Maxq/p/6566558.html WebKit.net是对WebKit的.Net封装, 使用它.net程序可以非常方便的集成和使用webkit作为 ...

  10. Shiro集成Spring

    本篇博客主要讲述的是两者的集成.不涉及到各自的详细细节和功能. 因为官方给出的文档不够具体,对新手而言通过官方文档还不可以非常快的搭建出SpringShiro的webproject.本博客将通过实际的 ...