树状数组

知识点 - 树状数组

China☆狼群 提交于 2019-11-27 13:53:54
知识点 - 树状数组 解决问题类型: 单点更新,前缀查询,很简单地拓展到2维 复杂度即代码: //压行 #define lowbit(x) ((x)&(-(x))) void add(int x, int y) { for (; x <= idx; x += lowbit(x)) f[x] += y; } int sum(int x) { int ans = 0; for (; x; x -= lowbit(x)) ans += f[x]; return ans; } //从0开始的BIT(下标) struct FenwickTree { vector<int> bit; // binary indexed tree int n; FenwickTree(int n) { this->n = n; bit.assign(n, 0); } FenwickTree(vector<int> a) : FenwickTree(a.size()) { for (size_t i = 0; i < a.size(); i++) add(i, a[i]); } int sum(int r) { int ret = 0; for (; r >= 0; r = (r & (r + 1)) - 1) ret += bit[r]; return ret; } int sum(int l, int r)

树状数组

自闭症网瘾萝莉.ら 提交于 2019-11-27 12:29:59
模板 int T[maxn];//与原数组大小相同 int lowbit(int i){ return i &(-i); } void update(int i,int val){ while(i<=n){ T[i]+=val; i+=lowbit(i); } } int sum(int i){ int res=0; while(i>0){ res+=T[i]; i-=lowbit(i); } return res; } int query(int l,int r){ return sum(r)-sum(l-1); } 例题 HH的项链 https://www.luogu.org/problem/P1972 大小为N(<=1e6)的数组,每个元素为一种颜色,M<=1e6次询问,每次问[l,r]上有多少种不同的颜色 解法,将区间离线,按r从小到大排序,在树状数组种存每种颜色的最后一次出现的位置(权值改为1),询问l,r的区间和就是答案 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=1e6+5; struct Q{ int l,r,id; }q[maxn]; bool cmp(Q a,Q b){

Ping pong(hdu 2492 树状数组

爱⌒轻易说出口 提交于 2019-11-27 08:29:36
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2492 树状数组分别从前往后 从后往前 找比当前位置的值 小的个数 贴一个别人写的树状数组的博客: https://www.cnblogs.com/acgoto/p/8583952.html 还是很详细的 代码: #include<bits/stdc++.h> using namespace std; #define LL long long const LL N = 100005; LL mp[N],n,tree[N],c[N],d[N]; LL lowbit(LL x) { return x&(-x); } LL sum(LL x) { LL ans = 0; while(x>0) { ans+=tree[x]; x-=lowbit(x); } return ans; } void add(LL x) { while(x<N) { tree[x]+=1; x+=lowbit(x); } } int main() { int T,i,j; scanf("%d",&T); while(T--) { cin>>n; for(i=0;i<n;i++) { scanf("%lld",&mp[i]); } for(i=0;i<N;i++)tree[i]=0; for(i=0;i<n;i++)

NOIP模拟 20

坚强是说给别人听的谎言 提交于 2019-11-27 08:18:13
  来自liu_runda的善意         T1 周     究级难题,不可做,咕了。   T2 任      他为什么总强调没环啊?      他为什么总强调没环啊?      他为什么总强调没环啊?     ......     QAQ     因为他总是棵树,所以点的数量减去边的数量就是树的棵数。     越想部分分,越想不出正解。     真是妙极了   T3 飞     好奇为什么自己考场上没发现是让求逆序对     白给的40啊......没状态了          因为数状数组开不下,只能考虑从x的生成方式上突破     首先把逆序对数转化成 添加一个点时下标大于它的点的个数     发现x是a组等差数列的形式,所有数列公差又一定     那么每次贡献的变化是有规律可循的...     后一项贡献=前一项贡献-已经存在的等差数列数     注意判断第一串x,可能不是”完整“的等差数列,其贡献要在x[1]开始之后才减去。          于是只剩下首项的问题了     他的贡献难算。但是已经存在的点已知,可以求没贡献的点,也就是他前边的点。     1e5,树状数组就好了。     注意理解清楚树状数组到底是干什么用的     数列首项不好算,是个辅助工具。     所以只有位置<a的点需要塞到树状数组里     所以第一个x的位置如果>a,就别往里硬塞了。  

暑假集训-8.13总结

允我心安 提交于 2019-11-27 05:58:43
学习内容: 带权并查集&扩展域并查集、树状数组 今日完成题数: 9 今日看书情况 :195-208页 学习算法的总结: 树状数组其基本用途是维护序列的前缀和。对于给定的序列a,我们建立一个数组c,其中c[x]保存序列a的区间[x-lowbit(x)+1,x]中所有数的和。 用于单点更新和区间查询。 今日做题总结: 带权并查集&扩展域并查集: https://www.cnblogs.com/l999q/p/11344919.html 树状数组: https://www.cnblogs.com/l999q/p/11348178.html 树状数组+二分: https://www.cnblogs.com/l999q/p/11348580.html 今日心得: 最近看书学的东西之前差不多都在博客上看过学过,不知道是因为之前看过,这次看书感觉更好理解了。书上还是归纳得更好,更系统。 还是要多写思维题,感觉要算法套模板的题写多了之后反而很多简单思维题一下子想不到了。平时要多写点CF的题练练思维。 最近看书的效率还是有点慢,需要加强。 今日完成题数: 9 今日看书情况 :195-208页 学习算法的总结: 树状数组其基本用途是维护序列的前缀和。对于给定的序列a,我们建立一个数组c,其中c[x]保存序列a的区间[x-lowbit(x)+1,x]中所有数的和。 用于单点更新和区间查询。 今日做题总结

集训队8月14日(树状数组)

房东的猫 提交于 2019-11-27 05:49:10
刷题数:5 今天学了树状数组,感觉看书比以前光看博客刷题有用多了,对树状数组了解深刻了不少,主要是用来维护前缀和,然后进行一些问题的求解。 CF补题: https://www.cnblogs.com/2462478392Lee/p/11343965.html 还有个线段树的,明天正好学,后天补。 树状数组区间操作 https://www.cnblogs.com/2462478392Lee/p/11348175.html 树状数组+二分 https://www.cnblogs.com/2462478392Lee/p/11347860.html 树状数组求逆序数 https://www.cnblogs.com/2462478392Lee/p/11347860.html 总结 有目的性的看书刷题比漫无目的的看博客完成任务好太多。 来源: https://www.cnblogs.com/2462478392Lee/p/11348214.html

[洛谷]P1531 I Hate It (#树状数组)

拥有回忆 提交于 2019-11-27 04:53:47
题目背景 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩 输入格式 第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。学生ID编号分别从1编到N。第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。当C为'U'的时候,表示这是一条更新操作,如果当前A学生的成绩低于B,则把ID为A的学生的成绩更改为B,否则不改动。 输出格式 对于每一次询问操作,在一行里面输出最高成绩 输入输出样例 输入 #1 复制 5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5 输出 #1 复制 5 6 5 9 思路 没有用树状数组的?其实和 P2880 就是差不多的啊。这里写了一个树状数组求最值的板子。 #include <stdio.h> #include <iostream> #include

树状数组树链剖分

不羁岁月 提交于 2019-11-27 03:32:53
其实树状数组和线段树写树剖都差不多,只是换了一种储存数据的方式,一种占用空间小,但是相对耗时,一种占用空间大,但是很快。 模板题: 树链剖分 用树状数组会 tle 但是这也是一种思路 // Created by CAD on 2019/8/11. #include <bits/stdc++.h> using namespace std; using ll=long long; #define lowbit(i) (i&-i) const int maxn=1e5+5; /*树状数组*/ int c[maxn], wt[maxn], laz[maxn << 2]; ll n; ll mod; inline void Add(int x, int k) { while (x<=n) c[x]=(c[x]+k)%mod, x+=lowbit(x); } inline ll getSum(int x) { ll ans=0; while (x>0) ans=(ans+c[x])%mod, x-=lowbit(x); return ans%mod; } inline ll getsum(int l, int r, int s, int t, int p) { return (getSum(r)-getSum(l-1)+mod)%mod; } int cnt=0, head[maxn << 1

树状数组

北城余情 提交于 2019-11-27 02:54:10
树状数组复杂度 O(logn). 树状数组是一种维护前缀和,区间最大值,区间最小值,区间异或和等满足交换律的东西的数据结构,其支持单点修改和区间查询。 树状数组其实并不算一棵树,它是由数组+二进制的操作实现的,只是在实现的过程中我们借助了树形结构的思想,因此树状数组并不需要建树等操作。 一,认识树状数组 * 树状数组也是一棵二叉树,长相类似于一棵偏沉的线段树,其中最下面一排数组a代表给定的序列a1,a2....an,c1,c2....为节点编号,其中每个c都维护着若干个连续的a数组的最大值或和或最小值等,那么具体每个节点维护几个a数组呢?是编号是几就维护几个吗?从图中来看,显然不是。 仔细分析树状数组的结构,我们发现c[1],维护的是一个元素a[1],c[2]维护着两个元素a[1],a[2],c[4]维护着四个元素a[1],a[2],a[3],a[4]..... C[1] = A[1]; C[2] = A[1] + A[2]; C[3] = A[3]; C[4] = A[1] + A[2] + A[3] + A[4]; C[5] = A[5]; C[6] = A[5] + A[6]; C[7] = A[7]; C[8] = A[1] + A[2] + A[3] + A[4] + A[5] + A[6] + A[7] + A[8]; 我们发现每个树节点维护的节点个数都是2^k 个

差分+树状数组F - A Simple Problem with Integers

核能气质少年 提交于 2019-11-27 02:40:30
You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval. Input The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000. The second line contains N numbers, the initial values of A1, A2, … , AN. -1000000000 ≤ Ai ≤ 1000000000. Each of the next Q lines represents an operation. “C a b c” means adding c to each of Aa, Aa+1, … , Ab. -10000 ≤ c ≤ 10000. “Q a b” means querying the sum of Aa, Aa+1, … , Ab. Output You need