您的位置:首页 > 其它

HDU 1892 See you~(二维树状数组)

2013-12-02 11:00 459 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1892

很明显的二维树状数组的题目,注意点细节!

#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <iostream>
using namespace std;
#define maxn 1010
int map[maxn][maxn];
int tree[maxn][maxn];
int low[maxn];
char str[10];
int lowbit(int x){
return x&(-x);
}
int init(){
int i,j,m,n;
for(i=1;i<maxn;i++){
low[i]=lowbit(i);
}
for(i=1;i<maxn;i++)
for(j=1;j<maxn;j++){
tree[i][j]=low[i]*low[j];
map[i][j]=1;
}
return 0;
}
int sum(int i,int j){
int sum=0,now;
while(i>0){
now=j;
while(now>0){
sum+=tree[i][now];
now-=lowbit(now);
}
i-=lowbit(i);
}
return sum;
}
int update(int i,int j,int v){
int now;
while(i<maxn){
now=j;
while(now<maxn){
tree[i][now]+=v;
now+=lowbit(now);
}
i+=lowbit(i);
}
return 0;
}
int main(){
int i,j,k,t,n,x1,y1,x2,y2,n1,ca=0,x11,y11,x22,y22;
scanf("%d",&t);
while(t--){
init();
printf("Case %d:\n",++ca);
scanf("%d",&n);
while(n--){
scanf("%s",str);
if(str[0]=='S'){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++,x2++,y1++,y2++;
y22=max(y1,y2);
x22=max(x1,x2);
y11=min(y1,y2);
x11=min(x1,x2);
x1=x11,x2=x22,y1=y11,y2=y22;
printf("%d\n",sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1));
}else if(str[0]=='A'){
scanf("%d%d%d",&x1,&y1,&n1);
x1++,y1++;
map[x1][y1]+=n1;
update(x1,y1,n1);
}else if(str[0]=='D'){
scanf("%d%d%d",&x1,&y1,&n1);
x1++,y1++;
if(n1>map[x1][y1]) n1=map[x1][y1];
map[x1][y1]-=n1;
update(x1,y1,-n1);
}
else{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1);
x1++,x2++,y1++,y2++;
if(n1>map[x1][y1]) n1=map[x1][y1];
map[x1][y1]-=n1;
map[x2][y2]+=n1;
update(x1,y1,-n1);
update(x2,y2,n1);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU