学习一下树状数组(要理解性背下来模板):
#include <iostream>
#include <cstring>
using namespace std;
int lowbit(int n)
{
return n-(n&(n-1));
}
/**原始数组的i位置增加v后,更新c数组,n是边界
* @param n
* @param i
* @param v
* @param c
*/
void updata (int n, int i, int v, int c[])
{
int lb = lowbit(i); //求出转成二进制之后最低位的1所代表的的整数
for (int k = i; k <= n; k += lowbit(k)) //就是逐个加,例如C9+1(看图解)
{
c[k] += v;
}
}
int getsum(int c[], int i)
{
int sum = 0;
for (int k = i; k >= 1; k -= lowbit(k)) //就是往前扣,例如C12是1100,往前扣4,得C8,是1000,往前扣8,得C0,结束
{
sum += c[k];
}
return sum;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8};
int c[9];
memset(c,0,sizeof(c));
for (int i = 0; i < 8; i++)
{
updata(9, i+1, arr[i], c);
}
cout << getsum(c,5) <<endl;
cout << getsum(c,6) << endl;
cout << getsum(c,7) - getsum(c,5) << endl;
return 0;
}
应用示例:
https://blog.csdn.net/weixin_45550460/article/details/107885474
的第10题