增加一个数就update(x,1) 减去这个数就update(x,-1) 查看是否有某个数就query(x)-query(x-1)是否>0 看比a大k的数就二分查找query值为query(a)+k的数 http://www.tzcoder.cn/acmhome/problemdetail.do?& ...
分类:
编程语言 时间:
2020-05-15 18:33:55
阅读次数:
73
【lowbit】 1 #define lowbit(x) x&(-x) 【单点修改】 1 void add(int pos, int k) 2 { 3 while (pos <= n) 4 { 5 tree[pos] += k; 6 pos += lowbit(pos); 7 } 8 } 【区间询问 ...
分类:
编程语言 时间:
2020-05-14 01:51:06
阅读次数:
93
输入一个长度为n的数组,有以下两种操作: 1.输入一个数m,输出数组中下标1~m的 前缀和 2.对指定下标的 数值进行修改 我们有两种思路,一种是for循环累加,另一种是利用前缀和数组。两种算法多 次操作时间复杂度在O(n^2),我们不妨来用树状数组进行操作。 树状数组介绍(BIT,Fenwick ...
分类:
编程语言 时间:
2020-05-12 20:47:32
阅读次数:
103
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1754 解析:先说update操作。c[]表示所管辖的区间范围里的最大值。 void update(int id,int x) { while(id<=n) { c[id]=x; for(int i=1;i< ...
分类:
编程语言 时间:
2020-05-12 18:43:37
阅读次数:
55
树状数组 一、 引言 解题过程中,我们有时需要维护一个数组的前缀和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