![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树状数组
yzyyylx
这个作者很懒,什么都没留下…
展开
-
HDU - 1754 I Hate It (树状数组维护区间最值)
题面题意 给出一列数,有两种操作: 1.修改一个数 2.询问区间最大值方法 用树状数组来维护区间最值,复杂度为O(n*(logn)^2). 做法与维护区间和不同,因为修改最值时无法求出新的最值,但是维护的区间相同. 树状数组维护的区间是[u-lowbit(u)+1,u],可以据此来进行这些操作.修改 若sz[i]之前的值都正确,则可以发现C[i]可以用这段代码原创 2018-01-16 11:58:21 · 405 阅读 · 0 评论 -
[Zjoi2017]树状数组
题面题意有点难以描述将树状数组的两种操作写反后,维护单点异或(只有0和1),区间异或,则与答案正确的概率是多少。做法首先可以发现树状数组这样写反后维护的不是前缀和是后缀和,因此如果l-r的区间异或和与正确答案相同,则第l-1个数与第r个数相等,因此可以用而为线段树来维护x和y不同的概率,每次修改时根据修改位置与区间的关系讨论即可,而对于查询区间的左端点为1的情况则要特判,发现此时就是询问...原创 2018-12-08 10:00:05 · 256 阅读 · 0 评论 -
loj #2322. 「清华集训 2017」Hello world!
题面题意给出一棵树,要求支持两种操作: 1.给出u,v,从u开始每次向v条k条边(如果到v的距离小于k则直接到达v),对所有经过的点的权值开根。 2.给出u,v,从u开始每次向v条k条边(如果到v的距离小于k则直接到达v),求所有经过的点的权值和。做法根据每次跳的长度k进行分块,令块大小为S。 然后对于1~S中的每一个数i建一个森林,每个点的父亲是这个点在原树上与它深...原创 2018-09-02 11:35:33 · 645 阅读 · 1 评论 -
[国家集训队]矩阵乘法
题面题意给出一个矩形,每次询问子矩形中第k小的值。做法首先考虑二分答案,但是查询矩形中比某个数小的个数的复杂度极高,因此我们可以考虑整体二分。 整体二分:对于所有询问一起二分,处理时将答案小于等于mid的询问放左边,答案大于mid的询问放右边,然后递归分别处理左右两边,计算小于等于mid的数时,可以用二维树状数组动态完成,这样只要每次对此时处理的询问都询问一次二维前缀和来...原创 2018-08-29 21:21:35 · 248 阅读 · 0 评论 -
CodeChef - GERALD07 Chef and Graph Queries
题面题意给出一张无向图,每次询问编号L到R的边,问这些边连上之后一共有几个联通块。做法听说可以用分块加可持久并查集来做,可惜我不会。 我用的是LCT加树状数组,离线来做。 求连通块的个数可以考虑转化为求此时图中树边的个数,我们可以将询问按照右端点排序,然后随着询问的右端点的右移,来不断向LCT中加边,此时LCT中的边都是树边,将树边存入树状数组中,每次询问L,R这段区间...原创 2018-07-18 19:15:29 · 895 阅读 · 1 评论 -
可修改主席树(树状数组套主席树)
作用 普通主席树可以查询区间k小值,但若直接修改,则复杂度极大,而可修改主席树通过树状数组的辅助来修改,大大缩小了时间复杂度,缺点是空间复杂度过大. 修改的时间复杂度为O((logn)^2),空间复杂度为O(n*logn^2).实现方法 为了减小修改复杂度,可以修改每个区间管理的范围. 传统主席树每个点对应的主席树管理一个前缀,而可修改主席树因为树状数组在处理动态区间和上有优势原创 2018-01-26 19:57:39 · 580 阅读 · 0 评论 -
codeforces 341D Iahub and Xors
题面题意维护一个矩阵,要求支持以下两种操作: 1.对一个子矩阵全部Xor一个值 2.询问一个子矩阵的Xor值.做法首先考虑一维的情况,如果要维护区间异或,可以让每一个点i表示[1,i]这段区间的异或值,就可以发现,当区间[i,j]异或上一个值时: 1.当(j-i)为奇数时,[i,j]中与i的奇偶性相同的点会受到影响. 2.当(j-i)为偶数时,[i,j]中与i的奇偶性相同的点和j右边的所有点原创 2018-05-08 17:32:09 · 961 阅读 · 11 评论 -
树状数组
作用 可以用于单点修改和区间查询,且空间较少,时间复杂度为(n*log(n)).做法 顾名思义,树状数组本质上是一棵树,详见下图(网上找的). C数组表示要记录的数组,A数组表示每个点的数字,而在实际操作时只要记录C就行了,注意C[n]表示的并不是1~n的和. 上图可以转化为下图: A,C数组间的关系见下图: 修改 当我们要修改某个点时,只要修原创 2017-12-02 11:23:38 · 246 阅读 · 0 评论 -
bzoj 2434: [Noi2011]阿狸的打字机
题面题意给出一个字符串,表示一系列操作,对于被操作串(初始为空串)一共有一下三种操作: 1.给出a~z中的一个字符,表示在后面加上这个字符 2.B,删去一个字符 3.P,记录下此时的操作串 最后多次询问i串在j串中出现了几次做法根据数据范围,如果暴力模拟,记录下每次操作后的字符串,空间立刻就炸了,所以肯定要用字典树来存. 还可以发现如果对每次询问都暴力匹配或是在AC自动机上直接匹配,绝对会原创 2018-04-06 12:01:19 · 175 阅读 · 0 评论 -
树状数组维护区间和和区间修改
作用 可以用树状数组在(n*logn)内,虽然线段树也能,但是树状数组的代码,空间都要比它优越得多.实现方法 首先我们可以用差分的方法使区间修改可以在log的复杂度完成,但重点在于区间和的查询. 我们知道,此时num[i]=a[1]+a[2]+……a[i],可以利用树状数组快速求出. 而区间和则是(a[1]+a[2]+……a[i])+(a[1]+a[2]+……a[i-1])……原创 2018-02-08 19:53:23 · 478 阅读 · 0 评论 -
codeforces1111E Tree
题面题意给出一棵树,多次询问,每次询问给出一个根节点和k个点,问要求将它们划分为至多m个集合,要求每个集合中不包含存在祖先关系的点,则一共有几种方法。做法考虑单次询问怎么做,可以发现一个非常重要的性质,一个点的两个不同祖先不可能在同一个集合中,因此可以先将所有点根据到根节点的距离排序,记dp[i][j]dp[i][j]dp[i][j]表示前i个集合划分为j个集合的方案数,然后可得dp转移:...原创 2019-03-14 10:09:09 · 233 阅读 · 0 评论