1.3. 树状数组的核心代码 1.3.1. 修改 当我们修改数组 c[x] 的某个节点值后,通过1.2.2中的方式迭代更新其唯一的直接父节点。 void add(int x) { for(int i = x; i <= n; i += lowbit(i)) c[i] += change_value; } 1.3.2 查询 查询就是求 [1,x] 的前缀和,根据1.1.1节的区间划分,...
int add(int pos,int a) { while (pos<=n) { c[pos]+=a; pos+=lowbit(pos); } return 0; } int sum(int pos) { int ans=0; while (pos>0) { ans+=c[pos]; pos-=lowbit(pos); } return ans; }
树状数组(Binary Indexed Tree,BIT):一个用来记录和的数组(和sum类似,存放的却不是前i个整数和),而是在i号位之前(含i号位,下同)lowbit(i)个整数的和。 如上图所示,数组A是原始数组,A[1]~A[16]共16个元素; 数组C是树状数组,其中C[i]存放数组A中i号位之前lowbit(i)个元素之和。显然,C[i]覆盖的长度...
树状数组代码记录 因为发现树状数组除了代码已经忘干净了,所以放一张图。 不难通过图来理解。 #include<iostream>#defineN 1000001using namespacestd;inta[N],c[N];intn,m;intlowbit(intx){returnx&-x;//例子:x=30 其二进制为 11110 返回的是10的十进制}intquery(intx){intsum=0;for(inti=x;i>0;...
#include<bits/stdc++.h>using namespace std;const int N=1e5+2;vector<int> G[N];int tree[N]; int a[N];int L[N],R[N];int tot;int vis[N];int num[N];int ans[N];struct node{ int l,r;//每个子树的起始标号和结束标号 int c;//结点颜色 int id;//原来顶
洛谷P3368 【模板】树状数组 2(Python和C++代码) ##就是常规写法 用树状数组维护一个差分数组的前缀和,因为可推得若b[i]=a[i]-a[i-1],则a[i]=b[1]+…+b[i] (b[1]=a[1]-a[0],a[0]=0) 。 可发现a[i]只与b[j] (j<=i)有关,若将b[j]加上delta,其后所有值都将加dlt,因此只需...
//#include "stdafx.h"#include<iostream>usingnamespacestd;constintN=1e6;inta[N],h[N];//h[x]:h[x]储存的是[x,x-lowbit(x)+1]中每个数的最大值intn,m;intlowbit(intx){returnx&(-x);}voidupdata(intx){intlx=x;while(x<=n){h[x]=max(h[x],a[lx]);x+=lowbit(x);}}intquery...
题目链接:http://wikioi.com/problem/1082/ #include<cstdio>#include<cstdlib>#include<cstring>#definerep(a,b) for (int i=a;i<=b;i++)#definelowbit(x)(((~x)+1)&x)#defineMAXN 200010longlongt0[MAXN],t1[MAXN],t[MAXN],n,m;longlonggetsum(intl,intr){returnt[r]-t[l-1];}longlo...
{intL,R;cin>>L>>R;g[L-1].push_back({-1,s[L],i});//把询问拆分g[R].push_back({1,s[L],i});}for(inti=1;i<=n;i++){update(s[i],1);//update为树状数组的单点加for(autov:g[i]){ans[v.id]+=v.k*query(v.x);//query为树状数组的前缀和}}for(inti=1;i<=m;i++)...