题意

一个物品集合\(S\)初始为空,按时间递增顺序依次给出\(q\)次操作,操作如下:
1 v w e 表示在\(S\)中加入一个体积为\(v\)价值为\(w\)的物品,第\(e\)次操作结束之后移除该物品。
2 v 表示询问。你需要回答:
当前\(S\)是否存在一个子集使得子集中物品体积和为\(v\)。
当前\(S\)的所有物品体积和为\(v\)的子集中,价值和最大是多少(空集的价值和为0)。
\(q \leq 15000, max_v \leq 15000\),强制在线。

题解

正解复杂度竟然是\(O(qv \log q)\)的!
既然是这个复杂度,那就可以乱胡一通(打脸.jpg)……
考虑这个问题虽然强制在线,但有个性质:插入的物品已经给出了删除时间。
所以就可以有类似线段树分治的做法:
加入一个物品时加入到线段树上做多\(O(\log q)\)个区间节点上(仅仅打个标记)。
在查询时直接向下暴力合并。
但是为了复杂度,我们在每个节点最多只能做一次合并标记的工作。
容易证明,如果某个节点在某个查询时,标记被合并过了,那么之后插入时,在这个节点到根的标记上,一定不会有新标记出现。
所以当一个节点做过合并标记了,就打个标记表示以后不会再合并这个节点(信息是可以直接用的了)。
合并的时候就是01背包,总时间复杂度是\(O(qv \log q)\)。
但是还有问题在于空间。
这个问题有个巧妙的解决方案:记录深度,即开一个关于深度的dp数组。
因为在一个查询的时候,只需要\(O(\log q)\)个节点的信息,可以用深度直接进行区分;
并且线段树同一深度的每个节点信息使用的时间区间都是不交的(即对于任意一对时间区间\([l_1, r_1], [l_2, r_2]\),满足\(r_1 < l_2\)),不存在信息被同层节点占用后丢失,需要重新计算的问题。
空间复杂度降为\(O(v \log q)\)。

#include <bits/stdc++.h>
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef pair <int, int> pii;
const int L = 1 << 14, D = 18;int q, maxv, T;
int f[D][L];
bool vis[L << 2];
pii Ans;
vector <pii> g[L << 2];void insert (int o, int l, int r, int x, int y, int v, int w) {if (x <= l && r <= y) {g[o].push_back(mp(v, w));return;}int mid = (l + r) >> 1;if (x <= mid) {insert(o << 1, l, mid, x, y, v, w);}if (y > mid) {insert(o << 1 | 1, mid + 1, r, x, y, v, w);}
}
void append (int v, int w, int s, int t) {insert(1, 1, L, s, t, v, w);
}
pii query (int o, int l, int r, int x, int v, int d) {if (!vis[o]) {memcpy(f[d], f[d - 1], sizeof f[d]);for (auto p : g[o]) {for (int i = maxv; i >= p.fi; --i) {f[d][i] = max(f[d][i], f[d][i - p.fi] + p.se);}}vis[o] = 1;}if (l == r) {return mp(f[d][v] >= 0 ? 1 : 0, f[d][v] >= 0 ? f[d][v] : 0);}int mid = (l + r) >> 1;if (x <= mid) {return query(o << 1, l, mid, x, v, d + 1);} else {return query(o << 1 | 1, mid + 1, r, x, v, d + 1);}
}
pii ask (int x, int v) {return query(1, 1, L, x, v, 1);
}
int main () {memset(f[0], 192, sizeof f[0]), f[0][0] = 0;scanf("%d%d%d", &q, &maxv, &T);for (int qaq = 1, op, v, w, e, ans = 0; qaq <= q; ++qaq) {scanf("%d", &op), ans *= T;if (op == 1) {scanf("%d%d%d", &v, &w, &e);v -= ans, w -= ans, e -= ans;append(v, w, qaq, e);} else {scanf("%d", &v), v -= ans;Ans = ask(qaq, v);ans = Ans.fi ^ Ans.se;printf("%d %d\n", Ans.fi, Ans.se);}}return 0;
}

转载于:https://www.cnblogs.com/psimonw/p/11224545.html

loj534. 「LibreOJ Round #6」花团相关推荐

  1. [线段树分治][DP] LOJ #534. 「LibreOJ Round #6」花团

    Solution S o l u t i o n Solution 操作相当于是动态的做一个背包DP. 离线的话,线段树分治一下. 因为结尾是已知的,可以一边分治,得到一个修改操作,就插到线段树. 只 ...

  2. 「LibreOJ Round #11」Misaka Network 与求和(杜教筛 + Min_25)

    #572. 「LibreOJ Round #11」Misaka Network 与求和 推式子 ∑i=1n∑j=1nf(gcd(i,j))k∑d=1nf(d)k∑i=1nd∑j=1nd[gcd(i,j ...

  3. #530. 「LibreOJ β Round #5」最小倍数 二分 + 数论

    传送门 文章目录 题意: 思路: 题意: 思路: 本来想刷数位dpdpdp,无意间碰到了这个题来水水. 我们知道n!n!n!中质因子ppp的个数为∑i=1npi\sum_{i=1} \frac{n}{ ...

  4. [LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)

    #521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一 ...

  5. LibreOJ545. 「LibreOJ β Round #7」小埋与游乐场【网络流】

    545. 「LibreOJ β Round #7」小埋与游乐场 [题目描述] 传送门 [题解] 网络流,我们发现lowbit之后相同的点连出的边是相同的,所以可以缩点. [代码如下] #include ...

  6. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)

    [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 -- 接着他们发现自己收 ...

  7. loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...

    $ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...

  8. 「LibreOJ β Round #2」计算几何瞎暴力

    https://loj.ac/problem/517 题解 首先我们如果没有排序这个骚操作的话,可以直接记一下各个数位的前缀和,然后异或标记给全局打,查询的时候先把区间信息提取出来然后整体异或就好了. ...

  9. 「LibreOJ β Round #4」子集

    https://loj.ac/problem/526 题目描述 qmqmqm有一个长为 n 的数列 a1,a2,--,an,你需要选择集合{1,2,--,n}的一个子集,使得这个子集中任意两个元素 i ...

最新文章

  1. 在CentOS 6.8上安装Nginx
  2. python中@修饰符用法
  3. 题目1192:回文字符串
  4. 23 Python常用模块(一)
  5. python修改父类属性_Python super和设置父类属性
  6. x shell 配置 和相关注意点(vm相关注意点)
  7. 由获取子元素的方法find和children所获
  8. java url 短链接_推荐几个官方腾讯短链接url接口(含PHP演示代码)
  9. iPhone6s用户感动!升级ios13还能再战两年
  10. ie不兼容的几个js问题及解决办法
  11. Python入门--函数传递过程中实参的变化
  12. 面试官:有没有比读写锁更快的锁?
  13. 3. AJAX 请求与响应
  14. CCF CSP 202009-3 点亮数字人生
  15. 利用递归层次遍历句法结构树(Stanfordcorenlp及nltk)
  16. diy nas配置推荐2020_廉价NAS方案,手把手教你用淘汰主机安装黑群NAS
  17. Linux第7章Gdk及Cairo基础,Linux第7章Gdk及Cairo基础.ppt
  18. css涟漪光圈扩散_CSS3动画之:水波涟漪般的定位样式
  19. Android源码阅读工具AndroidXRef使用说明
  20. 单通道图片转换为3通道图片,实现灰度图上添加彩色标注

热门文章

  1. SQL50题(MySQL)
  2. 基于Redis生成递增序号
  3. https证书异常是什么意思?
  4. c语言求最大公约数多一个负号,C语言 求最大公约数
  5. ipa包的简单校验方法
  6. android 表情键盘切换,如何在键盘之间切换(从表情符号到qwerty,反之亦然)
  7. pl/sql插入语句插入数据库中文为????
  8. mysql语句总结_mysql语句总结
  9. 大学生python心得1000字_大学生心得体会1000字
  10. 【CAD .NET】设置保存为pdf文件的页面参数 边距,横向竖向