树状数组

来源:互联网 发布:直播笑声软件下载 编辑:程序博客网 时间:2024/06/05 05:50

1.改点(+/-)求区间

void add(int x,int v){for(;x<=n;x+=x&(-x))C[x]+=v;}void sub(int x,int v){for(;x<=n;x+=x&(-x))C[x]-=v;}int getsum(int x)//求1-x的和{int sum=0;for(;x>0;x-=x&(-x))sum+=C[x];return sum;}

2.求比某点x小的点的个数

          对于x,求getsum(x),再加入x:add(x,1);

         同理可求逆序(倒着插),求平面上在点A左下方的点的个数

3.改区间求点

         令del[i]表示i..MN段被加了多少。则区间修改[a,b]时,我们让del[a]++,del[b+1]--即可。(此时树状数组是建立在del数组基础上的)这个时候,要求某一个位置x的数的值时,用Getsum(x)来表示。