多重背包,$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;
}

最新文章

  1. TextField文本框
  2. Centos6一键搭建L2TP VPN服务器
  3. 2. MySQL
  4. AlphaGo实现原理
  5. Swift - 数组排序方法(附样例)
  6. Apache HTTP Server 与 Tomcat 的三种连接方式介绍(转)
  7. static方法与非static方法是否可以互相调用
  8. 【数据库系列学习一】Access与Excel的区别和联系
  9. python中用xpath匹配文本段落内容的技巧
  10. DB2日常维护——REORG TABLE命令优化数据库性能(转)
  11. LM算法与非线性最小二乘问题
  12. RecyclerView下拉刷新上拉加载(二)
  13. FatMouse&#39; Trade -HZNU寒假集训
  14. 《图解HTTP》读书笔记(二:各种协议与HTTP协议之间的关系)
  15. spring 事务注解
  16. OSGI企业应用开发(十四)整合Spring、Mybatis、Spring MVC
  17. “数学口袋精灵”第二个Sprint计划(第九天)
  18. [洛谷 P1559] 运动员最佳匹配问题
  19. [转]How rival bots battled their way to poker supremacy
  20. bzoj3262(cdq分治模板)

热门文章

  1. 2015.7.16(小高开忍住没有减仓,大盘涨3.5%,百股涨停——买进中重、中航,指导WXL错误)
  2. 主攻ASP.NET.4.5.1 MVC5.0之重生:政府行政网站常用友情链接跳转javascript[干货分享]
  3. iOS_Quartz 2D绘图
  4. Android源码目录分析【转】
  5. java格式化输出 printf 例子
  6. HBase-存储-HFile格式
  7. Node.js的原型继承函数 util.inherits
  8. 搭建confluence参考文献
  9. Spring初学之bean的生命周期
  10. Regular Expression Matching,regex,正则表达式匹配,利用动态规划