点击打开SPOJ 1029
思路: 二维树状数组
分析:
1 简单的二维树状数组,注意因为数据量很大TLE了多次,之后把memset改成for循环A了
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 1100; int n; int mat[MAXN][MAXN]; int treeNum[MAXN][MAXN]; int lowbit(int x){ return x&(-x); } void add(int x , int y , int val){ for(int i = x ; i < MAXN ; i += lowbit(i)) for(int j = y ; j < MAXN ; j += lowbit(j)) treeNum[i][j] += val; } long long getSum(int x , int y){ long long ans = 0; for(int i = x ; i > 0 ; i -= lowbit(i)) for(int j = y ; j > 0 ; j -= lowbit(j)) ans += treeNum[i][j]; return ans; } void solve(){ char str[10]; int x , y , val; int x1 , y1 , x2 , y2; while(scanf("%s" , str) && str[0] != 'E'){ if(str[1] == 'E'){ scanf("%d%d%d%*c" , &x , &y , &val); add(x+1 , y+1 , val-mat[x+1][y+1]); mat[x+1][y+1] = val; } else{ scanf("%d%d%d%d%*c" , &x1 , &y1 , &x2 , &y2); x1++ , y1++ , x2++ , y2++; long long ans = getSum(x2 , y2); ans -= getSum(x1-1 , y2); ans -= getSum(x2 , y1-1); ans += getSum(x1-1 , y1-1); printf("%lld\n" , ans); } } } int main(){ int cas; scanf("%d" , &cas); while(cas--){ scanf("%d%*c" , &n); for(int i = 0 ; i <= n ; i++) for(int j = 0 ; j <= n ; j++) treeNum[i][j] = mat[i][j] = 0; solve(); } return 0; }