洛谷题面传送门

介绍一种假做法,期望复杂度应该比较优秀,但可以卡掉(

首先这个问题显然严格强于只有添加元素的情况对吧,而只有添加元素的情况就是一个普通的背包,而只有插入操作的版本复杂度就已经达到了 \(\mathcal O(qV)\),因此此题 std 的复杂度肯定不低于 \(\mathcal O(qV)\),而此题数据范围和实现刚好够 \(\mathcal O(qV)\) 的做法通过,因此我们考虑往这个方向思考。我们可以想出一车奇奇怪怪地做法,但都过不去此题的限制,譬如:

  • 奇奇怪怪的做法 \(1\):显然此题后进先出的结构组成了一个栈对吧,因此我们考虑对于每个物品,记录栈底到该物品的背包情况,这样删除操作就移动个指针即可,时空复杂度均为 \(\mathcal O(qV)\),但由于此题空间限制很紧,该做法无法通过。
  • 奇奇怪怪的做法 \(2\):注意到每个物品存活的时间肯定是一个区间,因此考虑以时间轴为下标建立一棵线段树进行线段树分治,线段树向下递归时就将对应节点上的物品加入背包,回溯时直接记录个临时数组并撤回即可,时间复杂度 \(qV\log q\),空间复杂度 \(V\log q\),时间复杂度又无法卡进实现。

考虑将两个暴力结合一下。常用的结合暴力的做法无非就是利用根号的良好性质,因此我们考虑分块,我们设一个阈值 \(B\),然后将已经插入的元素分为两部分:整块和零散部分,具体来说假设插入的元素个数为 \(x\),那么我们将前 \(\lfloor\dfrac{x}{B}\rfloor·B\) 个元素分为 \(\lfloor\dfrac{x}{B}\rfloor\) 个整块,外加 \(x\bmod B\) 个散块。对于每个整块我们维护一下栈底到这个整块的右端点构成的背包,对于散块我们维护一下散块中前 \(i\) 个元素(\(i\le x\bmod B\))组成的背包,每加入一个元素,如果散块大小达到了 \(B\) 那就暴力将散块打包为一个整块,否则直接在散块最后一个元素末尾组成的背包中加入一个元素塞到背包序列的末尾。每次弹出栈顶元素时,如果当前散块被弹空了则暴力重构最后一个整块,否则直接令散块大小 \(-1\),这样一来,如果 \(B\) 固定那么显然是可以卡掉的,每次先插入 \(B\) 个元素然后不断删除,再插入,再删除,再插入,以此类推即可将复杂度卡到 \(qVB\),但是如果我们考虑玄学一波,\(B\) 在 \([101,200]\) 中随机,这样复杂度期望就是 \(qV\) 了(

极端数据大概是先插入 \(100\) 个元素,然后插入、删除,重复 \(100\) 次,再插入一个元素,插入、删除,重复 \(100\) 次,以此类推,这样不论 \(B\) 是啥都要重构同一块重构 \(100\) 次(

貌似题解区里也有神仙的做法复杂度与根号相关?并且还有严格的复杂度证明?orzorz/bx

const int MAXN=2e4;
int qu,V,blk_sz,cur=0,rst=0;
pii a[MAXN+5];
struct knap{
int w[MAXN+5];
void clear(){memset(w,0,sizeof(w));}
void ins(int x,int y){for(int i=x;i<=V;i++) chkmax(w[i],w[i-x]+y);}
} b[205],ed[205];
int calc(){
int res=0;
for(int i=0;i<=V;i++) chkmax(res,b[cur/blk_sz].w[i]+ed[rst].w[V-i]);
return res;
}
int main(){
scanf("%d%d",&qu,&V);srand(time(0));
blk_sz=rand()%100+101;
while(qu--){
static char opt[11];scanf("%s",opt+1);
if(opt[1]=='a'){
int x,y;scanf("%d%d",&x,&y);
a[++cur]=mp(x,y);rst++;
ed[rst]=ed[rst-1];ed[rst].ins(x,y);
if(rst==blk_sz){
b[cur/blk_sz]=b[cur/blk_sz-1];
for(int i=cur-blk_sz+1;i<=cur;i++) b[cur/blk_sz].ins(a[i].fi,a[i].se);
rst=0;
}
} else {
cur--;rst--;
if(rst<0){
for(int i=1;i<=blk_sz;i++) ed[i].clear();
rst=blk_sz-1;
for(int i=1;i<blk_sz;i++) ed[i]=ed[i-1],ed[i].ins(a[cur-rst+i].fi,a[cur-rst+i].se);
}
} printf("%d\n",calc());
}
return 0;
}
/*
4 8
add 2 1
add 3 2
add 4 3
add 5 4
*/

最后稍微提一下正解,大概就你可以把一个入栈弹栈序列与一棵树对应,这样建出树出来,等价于有一棵节点数为 \(\mathcal O(q)\) 的树,树上每个点有一个物品,要求每个点到根路径上的物品组成的背包。我们对树进行树链剖分,然后对于每个点我们记录下它到根节点的每个重链的前缀组成的背包,那么对于每个点我们先遍历一遍它的轻儿子,这样这个链的前缀背包就是这个点的答案,然后再遍历它的重儿子将它重儿子对应的物品加入这个重链的背包,不难发现由于每个点到根节点重链个数是 \(\log q\) 级别的,因此空间复杂度是 \(V\log q\) 的,而由于每个点的贡献最多被加入一次,因此加入的复杂度为 \(\mathcal O(qV)\),刚好符合此题的限制。

代码?咕了~~

洛谷 P5391 - [Cnoi2019]青染之心的更多相关文章

  1. 洛谷 P2279 03湖南 消防局的设立

    2016-05-30 16:18:17 题目链接: 洛谷 P2279 03湖南 消防局的设立 题目大意: 给定一棵树,选定一个节点的集合,使得所有点都与集合中的点的距离在2以内 解法1: 贪心 首先D ...

  2. 【洛谷P1352】没有上司的舞会

    [洛谷P1352]没有上司的舞会 x舷售 锚」翅θ 但是 拙臃 蓄ⅶ榔 暄条熨卫 翘ヴ馇 表现无愧于雪月工作室的核心管理 爸惚扎掬 颇瓶 芟缆肝 貌痉了 洵┭笫装 嗝◇裴腋 褓劂埭 ...

  3. 洛谷P4593 [TJOI2018]教科书般的亵渎 【数学】

    题目链接 洛谷P4593 题解 orz dalao upd:经典的自然数幂和,伯努利数裸题 由题我们只需模拟出代价,只需使用\(S(n,k) = \sum\limits_{i = 1}^{n} i^{ ...

  4. 洛谷 P5564: [Celeste-B]Say Goodbye

    题目传送门:洛谷 P5564. 题意简述: 有 \(n\) 个点,染 \(m\) 种颜色,第 \(i\) 种颜色染恰好 \(cnt_i\) 个节点,满足 \(cnt_1+cnt_2+\cdots+cn ...

  5. 和小哥哥一起刷洛谷(4) 图论之广度优先搜索BFS

    关于bfs: 你怎么会连这个都不知道!!!自己好好谷歌一下!!!(其实我也刚学) bfs伪代码: while(队列非空){ 取出队首元素u; 弹出队首元素; u染色为黑色; for(int i=0;i ...

  6. 洛谷P1525 关押罪犯(并查集、二分图判定)

    本人蒟蒻,只能靠题解AC,看到大佬们的解题思路,%%%%%% https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编 ...

  7. 洛谷P1162—填涂颜色

    这应该是是第一次记录洛谷题库里的题目吧: 题目描述 由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向.现要求把闭合圈内的所有空间都填写成22.例如:6 \ ...

  8. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  9. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

随机推荐

  1. 2.2 DDD Layers & Clean Architecture DDD分层和简洁架构

    DDD Layers & Clean Architecture DDD分层和简洁架构 There are four fundamental layers of a Domain Driven ...

  2. Promise.resolve(x)中x有几种情况

    ps:下面参数说的是Promise.resolve(x)中的x 一共四种情况: 1.如果参数是Promise实例本身,则抛出错误 2.如果参数是一个promise对象,则then函数的执行取决于这个参 ...

  3. 第2次 Beta Scrum Meeting

    本次会议为Beta阶段第2次Scrum Meeting会议 会议概要 会议时间:2021年5月31日 会议地点:「腾讯会议」线上进行 会议时长:0.5小时 会议内容简介:对完成工作进行阶段性汇报:对下 ...

  4. OO第三次博客作业--第三单元总结

    一.JML 语言的理论基础及应用工具链 JML 是一种行为接口规格语言,提供了对方法和类型的规格定义手段.通过 JML 和其支持工具,不仅可以基于规格自动构造测试用例,并整合了 SMT Solver ...

  5. DDD领域驱动设计-项目包结构说明-Ⅳ

     基于DDD领域驱动设计的思想,在开发具体系统时,需要先建立不同的层级包.主要是梳理不同层面(应用层,领域层,基础设施层,展示层)包括的功能目录,每一个层面应该包括哪些模块.本例所讲述的分层是DDD落 ...

  6. Go语言核心36讲(Go语言进阶技术十一)--学习笔记

    17 | go语句及其执行规则(下) 知识扩展 问题 1:怎样才能让主 goroutine 等待其他 goroutine? 我刚才说过,一旦主 goroutine 中的代码执行完毕,当前的 Go 程序 ...

  7. linux shell exec 关联文件描述符

    在写shell脚本时,如果多个命令的输入或输出都是同一个文件,而这个文件的路径和名字都很长,则需要书写很多次同样的路径会很浪费时间,我们可以使用exec命令来关联一个自定义的文件描述符到一个特定的文件 ...

  8. linux命令中find, which、whereis、locate,有什么区别?

    whatis 用于查询一个命令执行什么功能,并将查询结果打印到终端上 which 查看可执行文件的位置 whereis 查看文件的位置 man Linux提供了丰富的帮助手册,当你需要查看某个命令的参 ...

  9. 滑动窗口的最大值 牛客网 剑指Offer

    滑动窗口的最大值 牛客网 剑指Offer 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6 ...

  10. Linux 内核网桥源码分析

    Linux网桥源码的实现 转自: Linux二层网络协议 Linux网桥源码的实现 1.调用 在src/net/core/dev.c的软中断函数static void net_rx_action(st ...