树状数组
文章平均质量分 67
树状数组刷题
荼白777
这个作者很懒,什么都没留下…
展开
-
简易版第k大——权值线段树模板&树状数组第k大
第k大思路每个节点表示数值,而不是表示区间Code#include <iostream>#include <cstdio>#include <algorithm>#include <vector>using namespace std;typedef long long ll;const int N = 1e6 + 10;int n,q,a[N];#define lc (p<<1)#define rc (p&原创 2021-10-05 18:45:46 · 112 阅读 · 0 评论 -
权值线段树&树状数组实现求第k大&前驱&后继
题面思路这题其实是平衡树的板子…;用树状数组做需要离线离散化处理;首先增加删除一个数很容易,直接用树状数组的加一减一即可;如果要查询数值xxx的排名其实相当于问我们1到x-1有多少个数;那么query后加一即可;如果要查第kkk小的数,这个和往常的树状数组不同,要写一个新的函数;有两种理解方式,一种是类似倍增LCA的想法;另一种是反向求和;比如说我们要131313我们用二进制的思想去拼凑他,13=8+4+113=8+4+113=8+4+1核心思想就是找到一个小于它但是最大原创 2021-10-06 23:22:16 · 625 阅读 · 0 评论 -
树状数组O(n)建树
题目来源以这道题为例子首先我们知道树状数组是这样的;图中的C数组就是我们的树状数组;暴力建树首先我们可以通过单点修改的方式,暴力建树,但是这种是O(nlogn)O(nlogn)O(nlogn)的,如下;Codevoid add(int u,int v){ for(int x = u; x<=n; x+=lowbit(x)){ tr[x] += v; }}//暴力建树void build(){ for(int i=1;i<=n;++i){原创 2021-09-05 10:17:14 · 1111 阅读 · 0 评论 -
树状数组区间和、区间加减
题面题目分析如果用线段树做那就是裸题了,但是用树状数组我们需要转化一下;首先看到区间加,我们考虑使用差分;对于差分数组来说,维护区间加是很容易的,只需要单点修改;那么我们看看区间和有什么规律;比如求区间[L,R][L,R][L,R]的和,则是aL+...+aRa_L+...+a_RaL+...+aR那么对于差分数组b来说,则说∑i=LR∑j=1i\sum_{i=L}^{R} \sum_{j=1}^{i}∑i=LR∑j=1i;这个是暴力求法,会TLE的;我们将这个式子画出来,见原创 2021-09-05 15:40:21 · 811 阅读 · 0 评论