Binary Index Tree(一)(二)

来源:互联网 发布:有个微信精准定位软件 编辑:程序博客网 时间:2024/05/22 14:58
一维
#include <stdio.h>#include <string.h>#include <stdlib.h>#define N 50005int a[N],c[N];int n;int lowbit(int x){    return x&(x^(x-1));}void updata(int p,int x){    while(p<=n)    {        c[p]+=x;        p+=lowbit(p);    }}int sum(int p){    int sum=0;    while(p>0)    {        sum+=c[p];        p-=lowbit(p);    }    return sum;}int main(){    int m,i,t,k;    int a1,a2;    char str[10];    scanf("%d",&t);    for(k=1;k<=t;k++)    {        scanf("%d",&n);        memset(a,0,sizeof(a));        memset(c,0,sizeof(c));        for(i=1;i<=n;i++)        {            scanf("%d",&m);            a[i]+=m;            updata(i,m);        }        printf("Case %d:\n",k);        while(scanf("%s",str),strcmp(str,"End"))        {            if(strcmp(str,"Add")==0)            {                scanf("%d %d",&a1,&a2);                a[a1]+=a2;                updata(a1,a2);            }            else if(strcmp(str,"Sub")==0)            {                scanf("%d %d",&a1,&a2);                a[a1]-=a2;                updata(a1,-a2);            }            else if(strcmp(str,"Query")==0)            {                scanf("%d %d",&a1,&a2);                printf("%d\n",sum(a2)-sum(a1-1));            }        }    }}</span></strong>
二维
#include<stdio.h>#include<string.h>int c[1010][1010];int n;int lowbit(int x){    return x&(-x);}void updata(int i,int j,int x){   int q,p;   for(p=i;p<=n;p+=lowbit(p))   {       for(q=j;q<=n;q+=lowbit(q))       {           c[p][q]++;       }   }}int sum(int i,int j){    int sum=0;    for(int x=i;x>0;x-=lowbit(x))    {        for(int y=j;y>0;y-=lowbit(y))        {            sum+=c[x][y];        }    }    return sum;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int m;        scanf("%d%d",&n,&m);        char str[2];        memset(c,0,sizeof(c));        while(m--)        {            scanf("%s",str);            if(str[0]=='C')            {                int x1,y1,x2,y2;                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);                updata(x1,y1,1);                updata(x1,y2+1,-1);                updata(x2+1,y1,-1);                updata(x2+1,y2+1,1);            }            else            {                int x,y;                scanf("%d%d",&x,&y);                printf("%d\n",sum(x,y)%2);            }        }        if(t)            printf("\n");    }    return 0;}
 
原创粉丝点击