
树状数组
文章平均质量分 63
数据结构---树状数组
(xsj)
模拟只会猜题意
贪心只能过样例
DP一般看规律
数论只会gcd
计算几何瞎暴力
图论只会匈牙利
数据结构没学过
字符串只能干输入
展开
-
算法竞赛进阶指南 (树状数组) 买票
题面题解(树状数组+二分)和谜一样的牛只是题目背景不同,其他都是一样的,看一个样例,我们从后往前看,最后一个是2 69 ,那么就是它前面有两个数,它是第三个,然后再看1 33 ,因为放1 33 的时候 2 69 还没有放,所以不用考虑2 69 的影响,那么33 就应该在第二个位置,1 51 同理,在剩余位置的第二个位置,剩余只有1 4 ,所以在4的位置,77在剩余位置的第一个位置,所以最终的结果就是 77 33 69 51我们初始化数组中所有的位置为1,如果用过这个位置的数就删除,将值变成0,原创 2021-04-13 19:05:19 · 125 阅读 · 0 评论 -
codeforces 1023 D Array Restoration (树状数组)
题面题意有一个长度为n的序列,你可以进行 q 次修改,第i次修改将区间 [l,r] 的数修改成 i ,涉及的 q次修改必须要覆盖区间中的每个数,q 次修改之后,将这个序列中的某些数变为0,得到一个新的序列(就是输入的序列),问你能不能通过这个新的序列求出一个变0之前的合法序列题解要求的这个字符串肯定是要有q的,因为q是最后一次修改,修改之后肯定有q,那么就要求输入的这个序列要么包含q,要么包含0(我们就可以将0变为q),如果输入的序列既没有q也没0,那么一定输出NO要想有合法序列原创 2021-02-25 21:57:33 · 243 阅读 · 0 评论 -
算法竞赛进阶指南---0x42(树状数组)Lost Cows
题面题解先看题中样例,我们对于给定的数据,可以从后往前推,一开始牛的高度集合{1,2,3,4,5}(每个高度只能用一次),对于第5个牛给定的数据是0,说明它前面没有比它矮的牛,它的高度就是1,剩余集合{2,3,4,5},对于第4个牛给定的数据是1,说明在剩下的集合中只有1个牛比它矮,那就是第二小,说明它的高度就是3,以此类推,就可以算出每个牛的高度,所以我们可以发现,对于每一个牛ai,我们只需要在剩余的集合中找到一个排名为第 ai+1 的数,就是牛的高度那么我们现在的问题就转化成为了两个原创 2021-02-17 19:51:52 · 359 阅读 · 0 评论 -
算法竞赛进阶指南---0x42(树状数组)一个简单的整数问题2
题面输入样例10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4输出样例455915题解这道题涉及区间修改和区间查询,当然可以用线段树来做,但是杀鸡焉用宰牛刀,可以用树状数组解决的问题大可不必用线段树解决,如果对树状数组不了解的可以先看看这里,还是用一个简单的整数问题 那道题的思想,差分数组 (树状数组支持O(logn)单点修改,区间查询)“C l r d”,表示把 A[l],A[l+1],…,A[r原创 2021-02-16 18:06:36 · 270 阅读 · 0 评论 -
算法进阶指南----0x42(树状数组)楼兰图腾
树状数组作用( O(logn) )给出一个长度为n的数组,完成以下两种操作将第i个数加上k (单点修改)输出区间[i,j]内每个数的和 (区间查询)前置知识lowbit(x) 运算:x在二进制表示下最低位1及其后边的0构造成的数值举例说明:lowbit(12)=lowbit([1100]2)=[100]2=4int lowbit(int x){ return x & -x;}树状数组思想树状数组的本质思想是使用树结构维护”前缀和”,原创 2021-01-21 21:38:22 · 525 阅读 · 0 评论 -
算法进阶指南----0x42(树状数组)一个简单的整数问题
原题链接思路第一眼看,想到的肯定是差分,差分就是可以对区间进行整体的修改,然后再进行查询,嗯,,很符合题目,时间复杂度是O(n) 的,但是还有没有更好的算法呢,我们接着看2.树状数组是干嘛的(不知道的看:[链接] 它可以进行单点修改和区间查询,O(logn)正好与题中相反,我们只需要转化一下即可(https://blog.youkuaiyun.com/qq_44791484/article/details/112971537))3.我们将树状数组的 tr 数组 变成差分数组 ,每次的区间修改 就会变成原创 2021-01-21 22:49:20 · 378 阅读 · 0 评论 -
codeforces 1462F The Treasure of The Segments 贪心+树状数组
原题链接题意给出 n 个线段 [l1,r1],[l2,r2],⋯,[ln,rn],求最少去掉多少个线段才能存在一个线段 [lk,rk] 使得它与其余所有线段重叠。思路枚举哪个线段与其他所有线段重合,并通过树状数组计算与之重合的线段的数量,数量最多的即为所求线段。至于如何统计,可以将所有线段以左端点为第一关键字、右端点为第二关键字排序,对于每一个线段 [li,ri],左端点小于它的([l1,r1],[l2,r2],⋯,[li−1,ri−1]),统计右端点处于区间 [li,+∞) 的有多原创 2021-01-27 00:03:28 · 172 阅读 · 0 评论