HDU 1892 See you~
10952 ワード
http://acm.hdu.edu.cn/showproblem.php?pid=1892
2 Dツリー配列で、裸です...
View Code
2 Dツリー配列で、裸です...
View Code
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX=1010;
int weight[MAX][MAX],tree[MAX][MAX];
int lowbit(int i){
return i&(-i);
}
void update(int x,int y,int val)
{
for(int i=x;i<MAX;i+=lowbit(i))
for(int j=y;j<MAX;j+=lowbit(j))
tree[i][j]+=val;
}
int Sum(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+=tree[i][j];
return sum;
}
int main()
{
int T;
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
memset(tree,0,sizeof(tree));
for(int i=1;i<MAX;i++)
for(int j=1;j<MAX;j++)
{
update(i,j,1);
weight[i][j]=1;
}
//weight[0][0]=0;
int n;
scanf("%d",&n);
printf("Case %d:
",cas);
while(n--)
{
char op[2];
scanf("%s",op);
int x1,y1,x2,y2;
int n1;
switch(op[0])
{
case 'S':
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++;y1++;x2++;y2++;
int minx,miny,maxx,maxy;
minx=min(x1,x2);
miny=min(y1,y2);
maxx=max(x1,x2);
maxy=max(y1,y2);
printf("%d
",Sum(maxx,maxy)-Sum(minx-1,maxy)-Sum(maxx,miny-1)+Sum(minx-1,miny-1));
break;
}
case 'A':
{
scanf("%d%d%d",&x1,&y1,&n1);
x1++;y1++;
update(x1,y1,n1);
weight[x1][y1]+=n1;
break;
}
case 'D':
{
scanf("%d%d%d",&x1,&y1,&n1);
x1++;y1++;
if(weight[x1][y1]<=n1)
{
update(x1,y1,-weight[x1][y1]);
weight[x1][y1]=0;
}
else
{
update(x1,y1,-n1);
weight[x1][y1]-=n1;
}
break;
}
case 'M':
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1);
x1++;y1++;x2++;y2++;
if(weight[x1][y1]<=n1)
{
update(x1,y1,-weight[x1][y1]);
update(x2,y2,weight[x1][y1]);
weight[x2][y2]+=weight[x1][y1];
weight[x1][y1]=0;
}
else
{
update(x1,y1,-n1);
update(x2,y2,n1);
weight[x1][y1]-=n1;
weight[x2][y2]+=n1;
}
break;
}
}
}
}
return 0;
}