心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
二维树状数组的应用。每次在某个点上增加一个值,或是询问某块区域内的和。
以下是我的代码:
#include<iostream>
#include
<string>
#include
<algorithm>
#include
<cstdio>
#include
<cstring>
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int n(1001);

int bit[n+7][n+7];
bool bright[n+7][n+7];

void Add(int x,int y,int delta)
{
    
for(int i=x;i<=n;i+=lowbit(i))
        
for(int j=y;j<=n;j+=lowbit(j))
            bit[i][j]
+=delta;
}

int Sum(int x,int y)
{
    
int re(0);
    
for(int i=x;i>0;i-=lowbit(i))
        
for(int j=y;j>0;j-=lowbit(j))
            re
+=bit[i][j];
    
return re;
}

int main()
{
    memset(bit,
0,sizeof(bit));
    memset(bright,
false,sizeof(bright));

    
int m;
    cin
>>m;
    
while(m--)
    {
        
string cmd;
        cin
>>cmd;
        
if(cmd=="B")
        {
            
int x,y;
            scanf(
"%d%d",&x,&y);
            x
++;y++;
            
if(!bright[x][y])
                Add(x,y,
1);
            bright[x][y]
=true;
        }
        
else if(cmd=="D")
        {
            
int x,y;
            scanf(
"%d%d",&x,&y);
            x
++;y++;
            
if(bright[x][y])
                Add(x,y,
-1);
            bright[x][y]
=false;
        }
        
else if(cmd=="Q")
        {
            
int x1,y1,x2,y2;
            scanf(
"%d%d%d%d",&x1,&x2,&y1,&y2);
            x1
++;y1++;x2++;y2++;
            
if(x1>x2)
                swap(x1,x2);
            
if(y1>y2)
                swap(y1,y2);
            printf(
"%d\n",Sum(x2,y2)-Sum(x1-1,y2)-Sum(x2,y1-1)+Sum(x1-1,y1-1));
        }
    }

    
return 0;
}
posted on 2011-07-31 09:29 lee1r 阅读(242) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:数据结构

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理