poj 1195 Mobile phones(树状数组)

2015-01-27 14:02:06 · 作者: · 浏览: 13

裸树状数组,关键在于二维的求和操作不要写错。

getsum(u+1,v+1)+getsum(x,y)-getsum(u+1,y)-getsum(x,v+1);



#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        #include
        #include
        
          using namespace std; #define N 1050 int n,m; int tt[N][N]; int lowbit(int x){return -x&x;} void update(int r,int l,int num) { int i,j; for(i=r;i<=n;i+=lowbit(i)) for(j=l;j<=n;j+=lowbit(j)) tt[i][j]+=num; } int getsum(int r,int l) { int i,j; int ans=0; for(i=r;i>0;i-=lowbit(i)) for(j=l;j>0;j-=lowbit(j)) ans+=tt[i][j]; return ans; } int main() { int i,j,k,u,v,x,y; //freopen("in.txt","r",stdin); while(1) { scanf("%d",&k); if(k==0){scanf("%d",&n);n++;memset(tt,0,sizeof(tt));continue;} else if(k==1){scanf("%d%d%d",&x,&y,&u);update(x+1,y+1,u);continue;} else if(k==2) { scanf("%d%d%d%d",&x,&y,&u,&v); k=getsum(u+1,v+1)+getsum(x,y)-getsum(u+1,y)-getsum(x,v+1); printf("%d\n",k); } else break; } return 0; }