hd 1892 See you~

本文介绍了一种使用二维树状数组的数据结构实现方法,并通过具体的代码示例详细展示了如何进行区间更新与查询操作。该文重点讲解了二维树状数组的基本原理及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


二维树状数组,其实对这种数组还不是很理解,只是简单的应用还是会了,而且也体会到了为运算的强大,呵呵
#include <iostream>
//#include <algorithm>
//#include <stack>
//#include <string>
//#include <string.h>
//#include <map>
using namespace std;
#define MAX 1002
int map[MAX][MAX];
int sum[MAX][MAX];
int Lowbit(int m)
{
    
return m&(-m);
}

int Getsum(int i,int j)
{
    
int tempj,s=0;
    
while(i>0)
    
{
        tempj 
= j;
        
while(tempj>0)
        
{
            s 
+= sum[i][tempj];
            tempj 
-= Lowbit(tempj);
        }

        i 
-= Lowbit(i);
    }

    
return s;
}

void Inc(int i,int j,int m,int num)
{
    
int tempj;
    
while(i<=num)
    
{
        tempj 
= j;
        
while(tempj<=num)
        
{
            sum[i][tempj] 
+= m;
            tempj 
+= Lowbit(tempj);
        }

        i 
+= Lowbit(i);
    }

}



int main()
{
    
int T;
    
int i, j, k;
    
int n;
    
char c;
    
int x, y, x1, y1,x2, y2, n1;
    
int index = 1;
    scanf(
"%d"&T);
    
while (T--)
    
{
        printf(
"Case %d: ",index++);
        memset(map, 
0sizeof(map));
        
for (i=1; i<MAX; ++i)
        
{
            
for (j=1; j<MAX; ++j)
            
{
                map[i][j] 
= 1;
                sum[i][j] 
= Lowbit(i)*Lowbit(j);
            }

        }

        scanf(
"%d",&n);
        
for (i=0; i<n; ++i)
        
{
            getchar();
            scanf(
"%c"&c);
            
if(c == 'S')
            
{
                scanf(
"%d%d%d%d",&x1, &y1,&x2, &y2);
                
++x1, ++x2, ++y1, ++y2;
                
int lx, ly, rx, ry;
                
if(x1 > x2)
                    lx 
= x2, rx = x1;
                
else 
                    lx 
= x1, rx = x2;
                
if(y1 > y2)
                    ly 
= y2, ry = y1;
                
else
                    ly 
= y1, ry = y2;
                printf(
"%d ", Getsum(rx, ry)-Getsum(rx, ly-1)-Getsum(lx-1, ry)+Getsum(lx-1, ly-1));
            }

            
else if(c == 'A')
            
{
                scanf(
"%d%d%d",&x, &y, &n1);
                
++x, ++y;
                Inc(x, y, n1, MAX
-1);
                map[x][y] 
+= n1;
            }

            
else if(c == 'D')
            
{
                scanf(
"%d%d%d",&x, &y, &n1);
                
++x, ++y;
                
if(n1 > map[x][y])
                    n1 
= map[x][y];
                Inc(x, y, 
-n1, MAX-1);
                map[x][y] 
-= n1;
            }

            
else if(c == 'M')
            
{
                scanf(
"%d%d%d%d%d",&x1, &y1,&x2, &y2,&n1);
                
++x1, ++x2, ++y1, ++y2;
                
if(n1 > map[x1][y1])
                    n1 
= map[x1][y1];
                Inc(x1, y1, 
-n1, MAX-1);
                Inc(x2, y2, n1, MAX
-1);
                map[x1][y1] 
-= n1;
                map[x2][y2] 
+= n1;
            }

        }


    }

    
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值