随笔分类 - 主席树
摘要:HDU 5737 很明显能发现数据是随机的。 我们用set去维护值一样的段, 因为随机所以set里面线段的大小减少得很快, 平均大概30个左右。 每次查询暴力处理每一段相同的在主席树上查找累加答案就可以了。 但是这个好像不是标算, 标算复杂度(n + m) * log(n) 并且数据不是随机也可以。
阅读全文
摘要:HDU - 5788 我们考虑把每个点遍历一遍, 把枚举的当前的这个点改成100000对答案的影响。 如果我们把 u 变成 100000, 受到影响的是 u 以及它的祖先, 我们记midu为子树u的中位数, nexmidu为子树u中位数的下一个数。 只有 a[ u ]的值小于等于祖先的mid, 才会
阅读全文
摘要:HDU - 5790 前缀总和为o(n)级别的, 然后把前缀hash一下变成求区间本质不同数字的个数。 或者不用hash丢到字典树上去就好了。
阅读全文
摘要:Katya and Segments Sets 感觉好久没打代码了。。写个主席树debug半天。。 按r排序, 用主席树维护当前为止, 每个种类的集合的 l 的最大值的最小值。
阅读全文
摘要:Functions On The Segments 考虑处理出所有x <= 2e5的答案。 用主席树去维护, 每个 x 的值, 因为是单点询问所以可以差分, 不用打标记。 一个PLL 打成了 PII, 找了半天bug。
阅读全文
摘要:Paper task 如果不要求本质不同直接st表二分找出最右端, 然后计数就好了。 要求本质不同, 先求个sa, 然后用lcp求本质不同就好啦。
阅读全文
摘要:Souvenirs 我们将询问离线, 我们从左往右加元素, 如果当前的位置为 i ,用一棵线段树保存区间[x, i]的答案, 每次更新完, 遍历R位于 i 的询问更新答案。 我们先考虑最暴力的做法, 我们先找到位于 i 前面第一个 j, a[ j ] > a[ i ], 那么x 属于 [ 1, j
阅读全文
摘要:One Occurrence 为什么我半年前这么菜呀, 这种场只A三题。。。 我们在主席树 || 线段树上维护每个数的右边和它一样的数在哪里, 然后就变成了区间求最大值。 注意加进去的时候要把它右边一样的数的信息删掉。 我懒得离线数据就写了个主席树。
阅读全文
摘要:D - Zip-line
阅读全文
摘要:HDU - 3333 题目大意:求区间不同类型的数字之和。 离线:将询问按 r 值排序,拿到一个询问的时候,我们将比位置在r之前的数字全部加入树状数组,加入数字的规则如下: 假设加入的数字为x,如果x之前没有出现过,直接加入,否则删除前一个x,再加入x,这样保证了树状数组里面一类数只有一个,并且都是
阅读全文
摘要:题目大意:主席树的加减区间更新。 思路:lazy标记搞一搞,注意不需要push_down,写的时候push_up忘了加上自己的lazy疯狂WA。。。
阅读全文
摘要:题目大意:树上第k小的数。 思路:和区间第k小的数的做法差不多,不过要求一下lca,比较麻烦。
阅读全文
摘要:D - Persistent Bookcase 题目大意:有三种操作,第一种操作,在i 个书架,j个位置放一本书,第二种操作,取下第i个书架,j 个位置的书,第三种操作, 把第i个书架所有没有书的位置放上书,有书的位置拿掉数,第四种操作,回到第k个操作,问你每次操作后书的总数。 两种方法:1、离线之
阅读全文
摘要:题目大意:给你n个数,q个询问,每个询问问你在 l 到 r 之间的第k个数是多大。 思路:很经典的一道题,有许多种做法。 第一种:在挑战程序设计里面有介绍的分桶法。 第二种:以建立一棵线段树,每个节点维护当前区间的有序数组。 第三种:刚学的主席树,一棵普通的线段树在进行修改后是无法保存以前的线段树的
阅读全文