数状数组【记忆性代码】

数组C存数据
Ck的含义是某个区间和【K-lowbit(k), k】
lowbit(k)是k的二进制的第一个1
如(10)1010的第一个1是2
在这里插入图片描述

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

int lowbit(int n){
	return n-(n&(n-1));
}
/*
 *原始数组的i位置增加v后, 更新c数组  n是边界 
*/
void updata(int n, int i, int v, int c[]){
	 
	for(int k = i; k <= n; k += lowbit(k)){
		c[k] += v;
	}
}

int getSum(int c[], int i){
	int sum = 0;
	for(int k = i; k >= 1; k -= lowbit(k)){ //k往前移动 
		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, 7) - getSum(c,4) << endl;
	return 0;
}


发布了28 篇原创文章 · 获赞 22 · 访问量 1035

猜你喜欢

转载自blog.csdn.net/qq_45432665/article/details/103227830