树状数组
文章平均质量分 77
alpc_qleonardo
这个作者很懒,什么都没留下…
展开
-
Comet OJ - Contest #14(set区间操作 + 树状数组)
Comet OJ - Contest #14做法这题是一个很骚的做法。因为每次是把整个区间覆盖为某个数字,所以可以看作是把一段区间内的很多段数字合并成一个的过程。我们考虑用setsetset去维护这个过程,setsetset里面保存四元组(l,r,x,id)(l,r,x,id)(l,r,x,id),表示区间[l,r][l,r][l,r]都是xxx且是在第ididid个操作之后改变的。se...原创 2019-11-09 18:31:14 · 311 阅读 · 0 评论 -
CodeForces 848C Goodbye Souvenir(CDQ分治+平衡树/set+树状数组)
再度加深对CDQ分治的理解。大致题意:给你一个数字序列,然后有两种操作。一是修改,把某个位置的数字改成另外一个数字;二是求一个区间[l,r]中所有同类数字的最大跨度和,即如样例所示。 首先,对于这个同类数字中的最大跨度和,对于每一个数字可以按照套路,分成所有前后相邻两个同类数字的距离和。即1、2、1、3、1、2、3对于数字1的最大跨度,我们可以写成(3-1)+(5-3)=4,也样子相当于只需要维护前后两个相邻的数字即可。然后,我们考虑如何对于每个数字维护这个前后关系,支持删除然后又支持修改,原创 2017-12-14 20:46:56 · 465 阅读 · 0 评论 -
CodeForce 958C3 Encryption (hard)(dp+树状数组)
大致题意,给你n个数字,然后让你把这n个数字分成连续的k组,然后每一组的权值是每组所有数字的和模p。现在问所有组的权值和的极值。 首先,我们说一下这道题目的前两个版本的解法。C1是求最大值,k固定等于2,这个随便怎么暴力都行。 C2也是求最大值,然后n、k、p的范围分别是2*10^4、50和100。我们可以考虑简单的dp。令dp[i][j]表示前i个数字分成j组的最大值。有转移方程:dp[i][j]=max(dp[k][j-1]+(s[i]-s[k])%p)。可以看到这个dp的时原创 2018-04-20 23:37:08 · 400 阅读 · 0 评论 -
HDU 6315 2018HDU多校赛第二场 Naive Operations(线段树+树状数组)
大致题意:初始的时候给你序列bi,然后ai初始为0。现在又两种操作add l r 和query l r。add是把a中区间[l,r]加一,query是让你求∑⌊ai/bi⌋,即区间内ai数值除以bi向下取整。个人最擅长做的题系列~现场50min时A题O(∩_∩)O……首先说明一下,这里用普通的线段树维护区间和之后再去除法,什么通分什么的都不行。因为这里的次序是先向下取整再进行求和。所以得考虑用其他的方法。仔细观察,我们可以发现,只有当ai的数值增加了bi的时候,才会对最后的结果产生贡献。因此,我们完全可以利原创 2018-07-25 19:23:17 · 433 阅读 · 2 评论 -
HDU 6393 2018HDU多校赛 第七场 Traffic Network in Numazu(树链剖分 + 树状数组)
大致题意:给你一个含有一个环的树,即n个点n条边的图,然后动态修改每一条边的边权,同时动态询问任意两点之间的最短距离。非常裸的一道图论+数据结构题。首先,我们考虑如果没有环的情况下,那就是一个显然的树链剖分+线段树/树状数组的题目,但是现在有一个环就变得不一样了。但是这种题目显然是要把树变成环的,于是我选择环上的一条边剪断,选择环上任意一个点为根,这样就可以构成一棵树了。具体来说,我把树分为两个部分,一个是环上的点,一个是非环上的点。对于环上的点,我们维护一个树状数组0,表示环内各个点不绕圈的情况下相互到达原创 2018-08-15 08:25:43 · 396 阅读 · 0 评论 -
HDU 6274 Master of sequence(二分答案 + 树状数组)
大致题意:给你两个数列{ai}和{bi}。每次有三种操作,对于第一种是改变某个ai,第二种是改变某个bi,第三种是让你求满足的最小的t。首先,这种求满足条件的最小值,肯定是二分答案无疑了。然后我们看这个S(t)的表达式子,一个很显然的想法是把分子拆分成为两个部分,一个是bi/ai和t/ai,另一个是bi%ai和t%ai。然后相减也是两部分相减,可以看出,最后的结果就是前一部分之差,然后后面一部分如果之差大于等于0,那么结果不变,否则还要再减去一个1。然后,本题看到了一个特殊的条件,ai的范围只会到1000,原创 2018-09-01 10:09:47 · 994 阅读 · 0 评论 -
计蒜客 ICPC沈阳网络赛 Ka Chang(树上分块 + 树状数组)
大致题意:给你一棵有根树,有两种操作,一是把某一层的所有的节点增加一个val,二是输出一个节点所在的子树的和。普通的dfs序可以支持子树查询,但是不能支持按照深度的修改。对于一个深度,修改一次的复杂度是klogn,k为这个神的的节点个数,可以看出,如果是一个类似菊花图的东西,时间复杂度会爆炸。然后为了解决菊花图下的复杂度问题,我们考虑在修改的时候知识对某一个深度打上一个标记,然后在查询的时候,遍历对应子树的所有深度,用对应深度的点的个数乘以深度的改变量即可。但是这样在遇到链的情况下,同样复杂度退化。于是我们原创 2018-09-09 11:08:16 · 277 阅读 · 0 评论 -
CodeForces 1051E Vasya and Big Integers(dp + 树状数组 + 字符串哈希/后缀数组)
大致题意:给你一个很大的数字,然后你可以把这个数字拆分成为任意多个部分,要求每一个部分的数字大小要在一个区间内,问有多少种拆分方式。由于是给定数字的拆分,所以区间对于拆分的限制,仅仅是限于长度。也即如果拆分的部分的长度介于上界和下界的长度之间,那么直接查分即可。如果长度等于上界或者下界,那么需要按位比较于界限的大小。可以看到,这个过程相当于一个转移的过程,很自然而然的想到用...原创 2018-09-24 12:33:42 · 631 阅读 · 0 评论 -
CodeForces 1045G AI robots(CDQ分治 + 树状数组 + 单调队列)
大致题意:有很多个机器人,他们要相互交流有一些限制条件。首先是,两个人要相互能够能够看到;其次,两个人的智商的差不超过K。现在给出每个机器人的视力范围和他们的智商,现在问你总共有多少对机器人能够相互交流。首先来看下总共有多少个限制条件。由于是要求双方都能够看到,所以显然是要按照视野半径去排序的。然后要求两个人的智商差要在一定的范围内的,所以也要按照智商去排序。另外还要跟自己的位...原创 2018-10-21 15:16:45 · 436 阅读 · 0 评论 -
计蒜客 2018ICPC徐州站/gym 102012G Rikka with Intersection(组合计数 + 树链剖分 + 树状数组)
大致题意:给你一个包含n个点的树和m条路径。现在让你从这m条路径中选择k条路,使得这k条路径一定有至少一个公共交点,问选出这k条路径的方案数是多少。最朴素的想法就是,每次查看一个点的贡献,也就是枚举这个公共点,然后看有多少个路径经过这个点,组合数求一下即可。但是这个错误也是很明显的,因为有可能同样一批路径,会有超过一个的公共点,这样的话就会重复计算。显然,如果有多个公共点的话,...原创 2018-12-02 22:47:15 · 881 阅读 · 0 评论 -
CodeForces 1096F Inversion Expection(树状数组 + DP + 组合计数)
好久没有做一道这么对胃口的题了……大致题意:给出一个1..n的全排列,但是其中有些数字被替换成了-1。我们设给出数列中-1的个数为x,那么原来的全排列就有x!种,而且告诉你取这x!种每一种的概率相等,现在问你原排列的逆序对的期望是多少。很显然,这个数列分为两个部分,一个部分是已经给出的正整数,另一部分是-1。那么相应的,逆序对可以分为三个部分,一个是正整数部分内部逆序对...原创 2018-12-29 16:40:51 · 458 阅读 · 0 评论 -
CodeForces 1111E Tree(LCA + DP +树状数组)
大致题意:给你一棵包含n个节点的无根树,然后q个询问,每个询问给出一系列点和m、r。表示问你,把根设置为r的情况下,把给定点分为至多m部分,要求每一部分至少一个给定点,且一个部分中不能出现两个给定点一个点是另一个点的祖先,问划分的方案数。还是一样,我们先简化问题,如果这时一个有根树,然后每次是固定根去询问。那么,令dp[i][j]表示只考虑给定点的前i个点,分为j个部分...原创 2019-02-09 16:40:53 · 543 阅读 · 2 评论 -
NEU 1704 三维偏序(CDQ分治+树状数组)
经典的三维偏序问题,cdq分治同样也是经典的做法。 不考虑这种方法的话,我们可以先对所有的数字按照x坐标排序,然后按顺序把另外两个坐标添加进二维树状数组里面,每次查询它前面的数字个数即可。然而这里总共有100000个数字,开二维树状数组即使在离散化的情况下,也会爆内存,于是貌似只能用CDQ分治。 首先当然的,对x进行排序,然后为了分治的方便,就直接把x坐标离散化。然后直接进入分治,由于这题的cdq分治在单位区间的时候不需要进行什么修改,所以我们大可以先分治两个小部分,再处理大原创 2017-12-02 19:46:58 · 600 阅读 · 0 评论 -
第九次多校赛总结+CSU 1914+CSU 1921加强版解法
应该是2017年上半年的最后的一场多校赛了,真的挺想留下一个美好的回忆,但是无奈力不从心…… 从一开始就是,水题疯狂卡,然后题目做法没有弄清楚,就去敲模板……记得1921那题一开始没想清楚,先是打了一个树状数组,后来发现不对打了个线段树,最后发现直接暴力就可以过…… 水题过后就是一般的题目,然而不知道状态不好还是什么,很容易看出来的解法当时却没有想到,贪心和简单的数据结构的应用都没有做出来。还一直在抱怨原创题出的奇怪……其实这些都只能怪自己最近太水了。我承认是我的问题,数据结原创 2017-05-08 18:13:35 · 418 阅读 · 0 评论 -
BZOJ 3110 [Zjoi2013]K大数查询(整体二分+树状数组)
其实呢,这题和之前写过的那个动态区间第K大很类似,只不过那个是修改,而这个是插入,但是同样都可以用线段树套Treap来实现。但是今天要说的是另外一种更加巧妙的分治方法,使得编程复杂度大幅下降——整体二分。 首先,我们知道,如果仅仅只是询问区间第K大,我们用的是二分答案。具体做法是二分一个数字,然后看区间内有多少个数字比他大,如果恰好有K-1个,那么枚举到的这个数字就是区间第K大。对于这道题目,我们同样也可以运用这种思想,只不过我们还要把这个所有的操作也和这个二分答案的过程一起做,所以顾名思义原创 2017-12-03 11:01:23 · 561 阅读 · 0 评论 -
HDU 5869 ACM-ICPC Regional Dalian Online(离线统计+树状数组)
本来想做数论的题目的,没想到是一道离线统计的题目。果然统计加离线大法的力量就是强…… 大致题意就是,给出一个数列,然后有很多询问,每次问一个区间内它的所有子区间的gcd的值有多少种。一开始的话认为可能会有一些区间的性质,即对于区间[l,r]可以用1到r的种类数减去1到l-1的种类数得到结果。但是发现这个正确性不能保证,因为前一段有gcd为x的,后一段可能也有gcd为x的,这样可能会使得方案数偏少。 于是想到用离线处理的方法,从最左边开始,按顺序把每一个数字的贡献加入。然后对于原创 2017-08-17 13:49:52 · 351 阅读 · 0 评论 -
HDU 4456 Crowd (坐标变换+树状数组+离散化)
看到坐标变换,有没有想到什么?对了,就是WOJ那题! 记得当时那题,Soul Artist,是静态的求和,直接用一个坐标变换加上二维的前缀和数组即可。这题也是类似的,不过他是动态的单点修改,动态区间查询。那么这就要用到二维树状数组了。原创 2017-07-18 15:52:27 · 407 阅读 · 0 评论 -
Codeforces 301D (顺序统计+树状数组)
Codeforces还是有一些很难的题的……这道题就真的不简单…… 给你一组n个数字,这些数字是1~n的一个排列。现在有很多个询问,询问给定一个区间,问区间内有多少个整除对。 说实话,根本想不到是用树状数组的题目……求整除对,怎么都像是数论的题目,为什么和树状数组有关。后来才知道统计的力量!原创 2017-07-16 19:09:03 · 914 阅读 · 0 评论 -
HDU 4267 (树状数组)
又是树状数组的专题,好多都做过,以为没有什么能够难倒我,然而还是有些题目虽然做出来了但是废了点周折。 这题的话,就是区间修改单点查询,但是不同之处在于,在一个区间内,他不是全部都修改,而是隔几个的修改。例如说,当k=2的时候,对于区间[l,r],修改l、l+2,l+4,……然后k是给定的,满足1 <= k <= 10。原创 2017-07-16 18:32:17 · 360 阅读 · 0 评论 -
HDU 5603 树状数组+逆向思维
很久以前遇到的一道题,大概是在武汉的时候的一次校内选拔?然后当时在酒店下午迷迷糊糊的看了,一下,瞬间被三个3*1e5吓哭了…… 然后紧接着又被第二天的武汉华中区邀请赛虐哭了……数据结构什么的还是很灵活多变的,也是博大精深…… 这题的话,看到都知道用的是数据结构,然后庞大的数据量着实让人头疼。看了题解之后也不胜唏嘘。原创 2017-05-07 23:03:45 · 472 阅读 · 0 评论 -
HDU 5892 Resident Evil(状态压缩+树状数组)
看到题目标题:Resident Evil,我就知道自己一定要拿下这道题,果然是个硬骨头…… 大致题意是,有两种操作,P是在一个矩形区域内每个小格子中放相同种类及数量的生化怪兽,Q则是让你输出某一矩形区域内所有生化怪兽总和的的奇偶性,生化怪兽总共有50种。首先,50种生化怪兽的奇偶性很容易想到用状态压缩去表示,而奇偶性的添加变化则刚好对应位运算中的异或,一切看似理所当然。但是真正实现起来发现,异或统计区间和并不像通常理解的那样。原创 2017-07-17 15:05:09 · 510 阅读 · 0 评论 -
2017多校训练赛第四场 HDU 6078 Wavel Sequence(dp+优化)
第四场多校,到现在才补…… 又是类似最长公共子串类型的dp。大致题意是给你两个序列a和b,然后问你能够选出多少个f和g映射,使得a[fi]==b[fi],而且a[f1]、a[f2]、a[f3]……a[fn]是波浪序列。 很容易想到的一个递推是dp[i][j][t]=Σdp[x][y][t^1](a[i]==b[j]且a[x]==b[y],同时满足波浪性),其中dp[i][j][t]表示序列a取到第i位,序列b取到第j位,而且当前是波峰(t==1)或者波谷(t==0)时的方案数原创 2017-09-19 19:44:18 · 510 阅读 · 0 评论 -
HDU 6230 Palindrome CCPC2017 Harbin(Manacher+树状数组+离线处理)
在哈尔滨的第一场比赛真的是像发疯了一样,在水题上纠结了近四个小时……当时真菜…… 现在回过头来看,这道题目还是非常的巧妙的。首先,我们要清楚的明白,这个回文的性质,例如:abcbabc,有两个对称中心'c'和'a',然后第二个对称中心的长度要恰好为两个对称中心的距离。转换成符号表示就是,i<j,j-i==len[j]且j-i<=len[i]。更确切的说就是,第二个对称中心要落在第一个对称的范围内,而且第二个对称中心的长度要恰好为两个对称中心的距离。 如果之前知道Manache原创 2017-11-11 22:57:45 · 1187 阅读 · 0 评论 -
HDU 5542 The Battle of Chibi(dp+树状数组)
按照惯例,比赛期间应该停止刷题…… 但是经过上次的失败经历我发现,手感这种东西还是很重要的,不然关键时候卡题…… 于是今晚重新刷一套CCPC,结果发现自己状态神勇,几乎是自己一个人在3小时10分钟内A了6题……虽说水题有好几道,但怎么说至少没有卡手,后面的这两道稍微算上中档题的dp也几乎是一次过样例。 废话说多了,看看这道题。就是给你一个序列,问你长度为m的严格上升序列总共有多少种。方案数问题,dp也是很明显的,有转移方程dp[i][j]=Σdp[k][j-1原创 2017-10-26 23:15:45 · 280 阅读 · 0 评论 -
Code Forces 589G Hiring(树状数组)
果然三个小时对于我们来说还是不够把中档以下的题目做完…… 此题其实也是一道不太难想到的一个中档题。大致题意:给你n个人,然后每一个人有每天工作的准备时间和他们的这几天要工作的总时长。然后他们只有m天的时间完成这个总时长,而且每天有限制的工作时间ti。对于这个工作准备时间,要计算在每天的工作时间以内。对于这点,比如说某个人准备时间为2,然后某天时间限制为5,那么有效工作时间就是3,如果时间限制小于准备时间,那么这天就没有有效工作时间。最后问每个人最早能在哪一天完成工作总时长。原创 2017-11-17 23:51:38 · 292 阅读 · 0 评论 -
HDU 5517 Triple ACM/ICPC 2015 Shenyang(二维树状数组)
题目读清楚,脑子不混乱,思路自然就会更清晰…… 这题就是给你两个集合A和B。A中每个元素包含两个数字a和b,然后B中每个元素包含三个数字c、d和e。我们规定,如果A中的i元素的b与B中的j元素的e相同,那么把这两个元素合并成<a,c,d>加入C集合中。然后,问C集合中,有多少个元素满足C中不存在某个元素的三个数字都大于等于它且不与其相等。 其实复述的也有点乱,好好理解一下吧……然后初始想法是,显然A中的元素,如果两个元素的b相等,而a一大一小,那么显然小的那个不会对结果产生贡原创 2017-09-03 20:40:09 · 460 阅读 · 0 评论 -
UVa 7037 ACM/ICPC 2014 Xian(网络流+最大密度子图)
大致题意:给你一个1~n的排列,然后让你在这个排列中挑选任意个数字,使得这些数字组成的子串的逆序对数量除以总长最大。 首先,我们先来回顾一下逆序对怎么计算。正常来说,O(N^2),但是大大可以用一些数据结构来优化。无非就是,加入一个数字的时候统计在此之前比该数字大的数字有多少个,然后再把这个数字加入。这种单点修改,区间查询,用树状数组再好不过了。 但是对于这题来说,由于数字可以是任意取,即不一定是取连续的一段,所以在子串的选取上就不太好处理。如果说本题是要求子串必须是原排列的原创 2017-09-13 21:59:00 · 472 阅读 · 0 评论