数状数组
来源:互联网 发布:阿里云服务器ip段 编辑:程序博客网 时间:2024/05/17 02:59
数状数组
数状数组求解:
下图是数状数组C和原数组a
数状形数组的规律:
•C1=a1
•C2=a1+a2
•C3=a3
•C4=a1+a2+a3+a4
•C5=a5
•……
•C8=a1+a2+a3+a4+a5+a6+a7+a8
•……
•C2n=a1+a2+….+a2^n
本质:对于序列a,数组C中的第x个元素为
C[x] = a[x – 2k+ 1] + … + a[x]
K为i的二进制表示中末尾0的个数
1) 与x对应的2k的计算 int lowbit ( int x ){return x & (-x); }
2) a[k]增加d时,数组C中相应元素的修改 void change(int k,int d,int n)//n是数组的最大下标{while (k<=n){c[k]=c[k]+d;k=k+lowbit(k);}}
3)计算a[1]+a[2]+……+a[K]int getsum(int k){int t=0;while (k>0){t=t+c[k];k=k-lowbit(k);}return t;}
完整代码:
#include <iostream>using namespace std;#define N 100int a[N],c[N];int lowbit(int x){return x & (-x); }void change(int k,int d,int n){while (k<=n){c[k]=c[k]+d; k=k+lowbit(k); } }int getsum(int k){int t=0;while (k>0){t=t+c[k];k=k-lowbit(k);}return t;} int main( ){ int i,n=8; memset(c,0,sizeof(c));for (i=1; i<=n; i++){ a[i]=i;change(i,i,n);}for (i=1; i<=n; i++)cout<<a[i]<<" "<<c[i]<<" "<<getsum(i)<<endl;a[3]=a[3]+50; change(3,50,8);for (i=1; i<=n; i++)cout<<a[i]<<" "<<c[i]<<" "<<getsum(i)<<endl;return 0;}
- 数状数组
- 数状数组
- 数状数组浅析
- 数状数组
- HDU1166 数状数组
- 数状数组
- Rotate(数状数组+逆序数)
- poj 3298 数状数组
- MooFest(数状数组)
- poj japan 数状数组解决逆序数
- hdu_2838 Cow Sorting(数状数组 逆序数)
- hdu5775Bubble Sort+数状数组求逆序数
- HDU3333(线段树/数状数组 + hash)
- 数状数组的原理与应用
- poj 2352 stars (数状数组)
- 【poj2155】【二维数状数组】Matrix
- poj2481 Cows(数状数组)
- hdu2492 数状数组或者线段树
- 延安客车罐车相撞引发的联想
- 消除: warning C4996: 'sprintf': This function or variable may be unsafe. Consider 的方法 .
- 64位WIN7的cmd功能无效解决办法
- union 共用体 联合体
- 排序?重叠数?傻傻分不清楚
- 数状数组
- WPF 深入研究 之 Control 控件
- HTML5代替Cookie? HTML5本地存储安全性
- 移动货币业务:准入制度,势在必行
- 心灵放松
- 程序员如何创业
- gsoap从网站生成C文件
- 探究Android的多分辨率支持以及各种类型图标尺寸大小
- CString 类型转换大全