树状数组基本讲解:
树状数组的用途就是求前缀和,他的本质跟线段树相似,就是一个空间换时间。
主要采用lowbit,通过二进制从而划分区间。
增加的时候,从下往上依次加lowbit
查询的时候,从上往下减去lowbit。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define For(a,b) for(int a=0;a > t ;36 for(int j=1;j<=t;j++){37 scanf("%d",&n);38 _mem(c,n); //初始化数组中前n+1个数为039 for(int i=1;i<=n;i++){40 scanf("%d",&z);41 update(i,z,n);42 }43 cout <<"Case "< <<":"< > s;46 if(s[0] == 'E')47 break;48 scanf("%d%d",&x,&y);49 if(s[0] == 'Q')50 cout << getsum(y)-getsum(x-1)<
求逆序对!
ci 的意思是在前lowbit 中元素的个数。
然后往前i个中的sum就是小于等于这个i的个数
这个数的位置-小于等于这个i的个数 就是前面大于这个数的个数
小于等于这个数的个数肯定比 这个数的位置要小。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
挖个坑下回把归并和快排的求逆序对放下来。
F - Cube
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include