-
- 题目给定4种操作: S x1 y1 x2 y2 询问以(x1 , y1) - (x2 , y2)为对角线的矩形的面积,但是这个对角线不一定是正对角线。A x1 y1 n 把点(x1 , y1)加上n。D x1 y1 n点(x1 , y1)减去n如果不足n就全部删除即可。M x1 y1 x2 y2 n 把点(x1 , y1)点值中扣除n加到(x2 , y2),如果不过n则把(x1 , y1)值全部加到(x2 , y2)
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- const int MAXN = 1e3+10;
- int n;
- int num[MAXN][MAXN];
- int treeNum[MAXN][MAXN];
- int lowbit(int x){
- return x&(-x);
- }
- int getSum(int x , int y){
- int sum = 0;
- for(int i = x ; i > 0 ; i -= lowbit(i))
- for(int j = y ; j > 0 ; j -= lowbit(j))
- sum += treeNum[i][j];
- return sum;
- }
- 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;
- }
- void init(){
- memset(treeNum , 0 , sizeof(treeNum));
- for(int i = 1 ; i < MAXN ; i++){
- for(int j = 1 ; j < MAXN ; j++){
- num[i][j] = 1;
- treeNum[i][j] = lowbit(i)*lowbit(j);
- }
- }
- }
- void solve(){
- init();
- char c;
- int x , y , val;
- int x1 , y1 , x2 , y2;
- int x3 , y3 , x4 , y4;
- while(n--){
- scanf("%c" , &c);
- if(c == 'S'){
- scanf("%d%d" , &x1 , &y1);
- scanf("%d%d%*c" , &x2 , &y2);
- x1++ , y1++ , x2++ , y2++;
- x3 = min(x1 , x2) , y3 = min(y1 , y2);
- x4 = max(x1 , x2) , y4 = max(y1 , y2);
- int ans = getSum(x4 , y4);
- ans -= getSum(x3-1 , y4);
- ans -= getSum(x4 , y3-1);
- ans += getSum(x3-1 , y3-1);
- printf("%d\n" , ans);
- }
- else if(c == 'A'){
- scanf("%d%d%d%*c" , &x , &y , &val);
- x++ , y++;
- num[x][y] += val;
- add(x , y , val);
- }
- else if(c == 'D'){
- scanf("%d%d%d%*c" , &x , &y , &val);
- x++ , y++;
- val = min(num[x][y] , val);
- num[x][y] -= val;
- add(x , y , -val);
- }
- else{
- scanf("%d%d" , &x1 , &y1);
- scanf("%d%d%d%*c" , &x2 , &y2 , &val);
- x1++ , y1++ , x2++ , y2++;
- val = min(num[x1][y1] , val);
- num[x1][y1] -= val;
- num[x2][y2] += val;
- add(x1 , y1 , -val);
- add(x2 , y2 , val);
- }
- }
- }
- int main(){
- int cas;
- int Case = 1;
- scanf("%d" , &cas);
- while(cas--){
- scanf("%d%*c" , &n);
- printf("Case %d:\n" , Case++);
- solve();
- }
- return 0;
- }
hdu 1892 See you 二维树状数组,很好的一道题
最新推荐文章于 2021-05-21 15:47:43 发布