标签:
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 18284 | Accepted: 8445 |
Description
Input
Output
Sample Input
0 4 1 1 2 3 2 0 0 2 2 1 1 1 2 1 1 2 -1 2 1 1 2 3 3
Sample Output
3 4
Source
题意:给你一个矩阵(初始化为0)和一些操作,1 x y a表示在arr[x][y]加上a,2 l b r t 表示求左上角为(l,b),右下角为(r,t)的矩阵的和。
分析:裸的二维树状数组。
ps:不能用读入优化
AC代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 1100 int n,c[N][N]; inline int lowbit(int x){ return x&-x; } void updata(int x,int y,int v){ for(int i=x;i<=n;i+=lowbit(i)){ for(int j=y;j<=n;j+=lowbit(j)){ c[i][j]+=v; } } } int sum(int x,int y){ int res=0; for(int i=x;i;i-=lowbit(i)){ for(int j=y;j;j-=lowbit(j)){ res+=c[i][j]; } } return res; } int getsum(int x1,int y1,int x2,int y2){ return sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1); } int main(){ int opt,l,r,x,y,a,b,t; while(scanf("%d",&opt)!=EOF){ if(opt==0){ scanf("%d",&n); memset(c,0,sizeof(c)); } else if(opt==1){ scanf("%d%d%d",&x,&y,&a); updata(x+1,y+1,a); } else if(opt==2){ scanf("%d%d%d%d",&l,&b,&r,&t); printf("%d\n",getsum(l+1,b+1,r+1,t+1)); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5765461.html