摘要: [TOC] 思路 每个节点维护一课线段树(当然是动态开点) 线段树的作用是统计这个节点有多少种粮食型号,以及最多的粮食型号 然后树上差分,u和v点 +1,lca(u,v)和f[lca(u,v)] 1(不显然就画图喽) 并不用转化为dfs序 只需要dfs一边,自底向上合并就好 优化 删除节点不必建树 阅读全文
posted @ 2018-12-10 21:53 ComplexPug 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 题目链接 "luogu" 思路 可以说是线段树合并的练手题目吧 也没啥说的,就是dfs,然后合并、、、 看代码吧 错误 和写主席树错的差不多 都是变量写错、、、、 代码 cpp include define FOR(i,a,b) for(int i=a;i'9'||s='0'&&s t[maxn]; 阅读全文
posted @ 2018-12-10 16:33 ComplexPug 阅读(109) 评论(0) 推荐(0) 编辑
摘要: 顾名思义 就是两颗线段树合成一个线段树 那合成的线段树是适合所有线段树吗 当然不是,是动态开点线段树 建树 这里建n个节点的时候,每个节点建一棵树 而且要按照一定的形态建立一条链 就是说如果最终形态是有n个数字的树, 那你初始化的那一条链子一定是这颗树上扣下来的 这样才方便合并 merge操作 最重 阅读全文
posted @ 2018-12-10 14:20 ComplexPug 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 思路 这里的初始化就不讲了,看完操作讲解就应该明白了,再不行就去看代码 对于操作1 由于操作2的需要,vector[n]存下数 对于操作2的维护 查询相邻两个元素的之间差值(绝对值)的最小值 先把所有答案存入一个小头堆里 比如 a,c之间你要插入b 那么,你就要删除|c a|,然后加入|a b|,| 阅读全文
posted @ 2018-12-10 10:19 ComplexPug 阅读(118) 评论(0) 推荐(0) 编辑