ACM常用模板——数据结构——树状数组

原创 2015年11月17日 15:45:50
(一)
一维BIT求和
模型:求区间[l,r]的和
  1. #define maxn 10005
  2. using namespace std;
  3. int n,bit[maxn];
  4. int sum(int i)//前i项的和
  5. {
  6. int s=0;
  7. while(i>0)s+=bit[i],i-=i&-i;
  8. return s;
  9. }
  10. void add(int i,int x)//第i项增加x,更新bit数组
  11. {
  12. while(i<=n){bit[i]+=x;i+=i&-i;}
  13. }
  14. int main()
  15. {
  16. int i,x,s,e,m;
  17. while(~scanf("%d%d",&n,&m)){
  18. memset(bit,0,sizeof(bit));
  19. for(i=1;i<=n;i++){
  20. scanf("%d",&x);
  21. add(i,x);
  22. }
  23. while(m--){
  24. scanf("%d%d",&s,&e);
  25. printf("%d\n",sum(e)-sum(s-1));
  26. }
  27. }
  28. }

(二)树状数组求逆序数
  1. #define maxn 10005
  2. using namespace std;
  3. int n,bit[maxn],a[maxn];
  4. int sum(int i)//前i项的和
  5. {
  6. int s=0;
  7. while(i>0)s+=bit[i],i-=i&-i;
  8. return s;
  9. }
  10. void add(int i,int x)//第i项增加x,更新bit数组
  11. {
  12. while(i<=n){bit[i]+=x;i+=i&-i;}
  13. }
  14. int solve()//求逆序数个数
  15. {
  16. int ans=0,i;
  17. for(i=0;i<n;i++){
  18. ans+=i-sum(a[i]);
  19. add(a[i],1);
  20. }
  21. return ans;
  22. }
  23. int main()
  24. {
  25. int i;
  26. while(~scanf("%d",&n)){
  27. memset(bit,0,sizeof(bit));
  28. for(i=0;i<n;i++){
  29. scanf("%d",&a[i]);
  30. }
  31. printf("%d\n",solve());
  32. }
  33. }
(三)二维树状数组
模型:矩阵初始化为0,C x1 y1 x2 y2:把矩阵翻转(0变1,,1变0),Q x y:查询位置x y的值
  1. const int MAXN = 1010;
  2. int c[MAXN][MAXN];
  3. int n;
  4. int sum(int x,int y)
  5. {
  6. int ret = 0;
  7. for(int i = x;i > 0;i -= i&(-i))
  8. for(int j = y;j > 0;j -= j&(-j))
  9. ret += c[i][j];
  10. return ret;
  11. }
  12. void add(int x,int y,int val)
  13. {
  14. for(int i = x;i <= n;i += i&(-i))
  15. for(int j = y;j <= n;j += j&(-j))
  16. c[i][j] += val;
  17. }
  18. int main()
  19. {
  20. int T;
  21. scanf("%d",&T);
  22. while(T--)
  23. {
  24. int q;
  25. scanf("%d%d",&n,&q);
  26. memset(c,0,sizeof(c));
  27. char op[10];
  28. int x1,y1,x2,y2;
  29. while(q--)
  30. {
  31. scanf("%s",op);
  32. if(op[0] == 'C')
  33. {
  34. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  35. add(x1,y1,1);
  36. add(x2+1,y1,1);
  37. add(x1,y2+1,1);
  38. add(x2+1,y2+1,1);
  39. }
  40. else
  41. {
  42. scanf("%d%d",&x1,&y1);
  43. if(sum(x1,y1)%2 == 0)printf("0\n");
  44. else printf("1\n");
  45. }
  46. }
  47. if(T > 0)printf("\n");
  48. }
  49. return 0;
  50. }

CCF CSP 201509-3 模板生成系统 java实现

问题描述   成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是   而当用...

蓝桥杯 历届试题 兰顿蚂蚁

问题描述   兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种。   平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。   蚂蚁的头部朝向...

活用各种数据结构——RMQ/树状数组/分桶法和平方分割

对《挑战程序设计竞赛》的一个记录第三章 出类拔萃——中级篇上一篇:3.3活用各种数据结构——线段树篇3.3活用各种数据结构——RMQ/树状数组/分桶法和平方分割RMQ(区间最值查询)有一个长度为n的乱...

HHU暑期第三弹——数据结构进阶(线段树+树状数组+并查集)

第三弹数据结构进阶的主要内容有以下几部分:线段树、树状数组、并查集。 一、线段树 一:线段树基本概念 1:概述 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数...

2017西安交大ACM小学期数据结构 [树状数组,极大值]

Problem D 发布时间: 2017年6月28日 10:51   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为...

ACM-数据结构-树状数组I

ACM竞赛中,树状数组,即二分索引树(BinaryIndexedTree,BIT),也是常见的一种数据结构,其应用场景如下: 给出一个长度为n的数组(a[1]-a[n]),每一次给出一个i,询问该数组...

2017西安交大ACM小学期数据结构 [树状数组]

Problem C 发布时间: 2017年6月28日 11:38   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为...

2017西安交大ACM小学期数据结构 [树状数组 离散化]

Problem E 发布时间: 2017年6月28日 12:53   最后更新: 2017年6月29日 21:35   时间限制: 1000ms   内存限制: 64M 描述 给定一个长度为...

2017西安交大ACM小学期数据结构 [又是树状数组、异或]

Problem F 发布时间: 2017年6月28日 10:31   最后更新: 2017年6月29日 21:35   时间限制: 2000ms   内存限制: 64M 描述 给定一个n×m...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ACM常用模板——数据结构——树状数组
举报原因:
原因补充:

(最多只允许输入30个字)