
树状数组Bit
linkfqy
A link to FQY.
展开
-
树状数组区间修改+查询
【前言】树状数组可以处理单点修改,区间求和的操作,这里就不再赘述了。现在,我们要考虑用树状数组实现区间加,区间求和的操作。由于树状数组常数较小,代码简短,可以在一些场合代替线段树。【实现】首先明确一下,query(c,i)表示求c数组的前缀和。定义要维护的序列为a[],对a[]进行一次差分,得到c[]。 即c[i]=a[i]-a[i-1],显然c[1]+c[2]+……+c[i]=a[i]如何维护c原创 2017-04-07 18:20:39 · 919 阅读 · 1 评论 -
【二分+正序对】51Nod 1711 平均数
题面在这里考虑二分答案,其实就是求平均值大于等于mid的区间个数写出来就是∑air−l+1≥mid\frac {\sum a_i} {r-l+1}\ge mid所以每一项减去mid,写成前缀和就是Sr−Sl−1≥0S_r-S_{l-1}\ge 0然后就是求正序对了示例程序:原创 2017-10-25 15:28:13 · 719 阅读 · 0 评论 -
【树链剖分+树状数组区间修改区间和】BZOJ4034(LOJ#2125)[HAOI2015]树上操作
题面在这里还可以双倍经验其实就是树链剖分裸题……只要注意到树链剖分序就是DFS序就可做了示例程序:原创 2017-10-16 14:33:55 · 922 阅读 · 0 评论 -
【DFS序+树状数组】51Nod 1681 公共祖先
题面在这里稍稍转化一下题面就可以得到,其实是求 ∑x=1nC2s\sum_{x=1}^n C_s^2 其中s是在两棵树中都是x的后代的节点个数如何统计s呢?其实也很简单先对一棵树处理出DFS序,然后遍历另一棵树时,不断插入当前节点,统计子树区间内的个数即可示例程序:原创 2017-10-30 19:52:32 · 778 阅读 · 0 评论 -
【整体二分+二维树状数组】BZOJ2738 矩阵乘法
题面在这里整体二分的经典应用:K大数查询对询问的答案整体二分。对于每个询问,如果对应子矩阵中值属于[L,mid][L,mid]的元素个数大于k,则该询问的答案一定小于mid具体实现可以将原矩阵内所有元素排序每次找到(二分一下)值属于[L,mid][L,mid]的所有元素,在对应位置+1用树状数组维护区间和就好了示例程序:原创 2017-10-06 11:17:00 · 771 阅读 · 0 评论 -
【整体二分+树状数组】BZOJ2527 [Poi2011]Meteors
题面在这里整体二分裸题……没什么好说的,对流星雨二分,每个国家的轨道用vector存一下就好了需要注意一下边界可能爆long long中间break掉就好了示例程序:原创 2017-10-04 21:34:24 · 883 阅读 · 0 评论 -
【二维树状数组】BZOJ1452 [JSOI2009]Count
题面在这里二维树状数组裸题……不解释了,直接上代码示例程序:原创 2017-09-29 20:02:38 · 771 阅读 · 0 评论 -
【整体二分+树状数组区间加区间和】BZOJ3110 [Zjoi2013]K大数查询
题面在这里同样是整体二分的经典应用:K大数但是有修改操作。其实也差不多。对于divide(L,R,S)divide(L,R,S),将S中所有操作按顺序排列由于查询第K大的,所以只需要知道有多少数比答案大即可如果操作是1:如果c≤midc\le mid说明只可能对答案在[L,mid][L,mid]的查询有贡献,放入S1S_1,否则放入S2S_2另外,把放入S2S_2中的操作加到树状数组里面如果操作原创 2017-10-06 18:11:32 · 480 阅读 · 0 评论 -
【主席树|莫队|离线树状数组】BZOJ1878 [SDOI 2009]HH的项链
题面在这里这道题有三种解法,以下分别介绍(等我A掉会补全)【主席树】关于主席树戳这里造一个lst[i]表示位置i的这个数上一次出现的位置(如果没有就是0) 那么对于每次询问L~R范围里的数字种数 其实就是询问对于L≤i≤RL≤i≤R,满足lst[i]<Llst[i]<L的个数 那么就很好搞了,对lst造N棵值域线段树 询问就直接找到L-1这个位置看它前面有几个 复杂度O(Qlogn)O(Q原创 2017-04-25 07:18:18 · 1098 阅读 · 1 评论 -
【树状数组+主席树】BZOJ1901 [ZOJ2112]Dynamic Rankings
题面在这里树套树第一题……考虑没有修改(POJ 2104)的情况,就是经典的主席树了 其实就是一个静态的前缀和,利用容斥原理求区间信息但是如果有修改操作呢? 不过是维护这个前缀和罢了。 当然有一个想法,就是修改时O(n)更新后面的所有位置(受此次修改的影响) 这样就太慢了,直接树状数组比较好。 树状数组的每一个单位都是一棵主席树,整个管辖范围的修改都记到它上面修改操作就在树状数组上依次修改原创 2017-05-02 21:30:24 · 1312 阅读 · 1 评论 -
【树状数组+二分】BZOJ2028 [SHOI2009]会场预约
题面在这里考虑到每个预约只可能被删除一次所以可以把与当前冲突的预约一个一个删除其实就是不断取某位置前面第一个比自己小的端点这个用树状数组+二分维护就好了(其实也是第K大问题)然后这样就O(nlog2n)O(nlog^2n)示例程序:原创 2017-10-26 15:33:21 · 838 阅读 · 0 评论