树状数组 一、 引言 解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+A[3]+A[4]+…+A[i]。 但是不难发现,如果我们修改了一个 A[i], S[i]、S[i+1]…S[n]都会发生变化。 可以说,每次修改 A[i]后,调整前缀和 S 在最坏的情况下会需要 O(n ...
分类:
编程语言 时间:
2020-05-12 16:40:29
阅读次数:
67
地址:https://ac.nowcoder.com/acm/contest/5477/F 解析:其实并不需要关心它具体是怎么构造的,那样的是很麻烦的。。。明确一点,某个位置出现的次数越多,就需要给它赋越大的值,既当前sum=出现次数*x。出现次数,可以通过差分数组或线段树维护一下,然后排个序,按顺 ...
分类:
编程语言 时间:
2020-05-11 00:50:32
阅读次数:
76
本地搬运~ 关于树状数组的学习,强烈推荐这个视频:https://www.bilibili.com/video/av26371798?from=search&seid=2141442207537065040 1:树状数组:查询和修改复杂度都为log(n)的数据结构,本身可用于单点修改区间查询,加入辅 ...
分类:
编程语言 时间:
2020-05-06 22:06:50
阅读次数:
95
树状数组简单来看就是一个维护前缀和的数据结构,它相当于线段树去掉了所有的右子树,需要查询时,通过信息拼接来达到查询目的,基础应用为 **(单点更新,区间查询)** **(区间更新,单点查值)** (多了个差分) **(区间修改,区间查询)** (通过数学推导得出我们需要维护两个树状数组) 具体内容参 ...
分类:
编程语言 时间:
2020-05-05 23:35:57
阅读次数:
76
题目 https://www.luogu.com.cn/problem/P1908 题目分析 树状数组的使用原因 可以开一个数组c[maxn],来记录前面数据的出现情况,初始化为0;当数据a出现时,就令c[a]=1。这样的话,欲求某个数a的逆序数,只需要算出在当前状态下c[a+1,maxn]中有多少 ...
分类:
编程语言 时间:
2020-05-04 21:42:08
阅读次数:
95
题目 https://www.luogu.com.cn/problem/P3368 题目分析 是区间更新 单点查询,使用树状数组 代码 #include<iostream> #include<cstdio> using namespace std; long long a[500001], c[50 ...
分类:
编程语言 时间:
2020-05-04 19:50:12
阅读次数:
78
题目 https://www.luogu.com.cn/problem/P3374 代码 树状数组版: #include<iostream> #include<cstdio> using namespace std; long long a[500001], c[500001]; int n, m; ...
分类:
其他好文 时间:
2020-05-04 17:03:40
阅读次数:
49
求解逆序对问题,首先基础方法就是归并排序,高阶方法可以用树状数组。 首先知道什么叫逆序对:对于一个序列$a$,如果$ia[j]$,则$a[i]$和$a[j]$构成逆序对。归并排序在 合并 的时候可以将求解逆序对作为子问题来求解,如果$a[p1]a[p2]$,那$p1 mid$的所有的值都比$a[p2 ...
分类:
编程语言 时间:
2020-05-03 23:10:07
阅读次数:
118
引入 如果你想维护一个数据结构,有一个序列 $a$,每次查询 $l\sim r$ 区间和(求 $\sum\limits_{i=l}^ra_i$),只有查询,线段树&树状数组难免有些大材小用,但是维护它效率要高,甚至要达到 $\mathcal{O}(1)$。 这个东西该怎么维护呢? 我们可以创造一个序 ...
分类:
其他好文 时间:
2020-05-03 10:57:33
阅读次数:
70
如果没有强制在线,那么可以树状数组+扫描线。 我们分析一下,如果有 $x$ 条有作用的边,那么很显然是 $n x$ 个连通块。 如果它是第一条边,也就是上一条边是 0,那么显然可以加入我们的这个答案。 如果和它重复的那条边在 0 ~ l 1 那么很显然也可以加入答案对吧,因为你这条边是连上的了。 所 ...
分类:
其他好文 时间:
2020-05-02 18:58:48
阅读次数:
62