您的位置:首页 > 其它

HDU 2642 Stars 简单二维树状数组应用

2010-09-23 23:01 656 查看
这道题同HDU 1892 有很大的相同点,但是更加简单!所以没有什么太大的难度!

只要小心状态更新时就是当该点的星星为亮是则不再设为亮,为暗是不再设为暗就可以了!就是这个状态的区别!小心就可以ac!

话不多说看代码:

#include<iostream>
using namespace std;
int tree[1010][1010];
int state[1010][1010];//另开一个数组来存储该点的星星的状态
int maxn=1009;
void update(int x,int y,int val)
{
int temp=y;
while(x<=maxn)
{
y=temp;
while(y<=maxn)
{
tree[x][y]+=val;
y+=y&-y;
}
x+=x&-x;
}
}
int read(int x,int y)
{
int sum=0,temp=y;
while(x>0)
{
y=temp;
while(y>0)
{
sum+=tree[x][y];
y-=y&-y;
}
x-=x&-x;
}
return sum;
}
int main()
{
int M,x1,y1,x2,y2,xmax,ymax,xmin,ymin;
string op;
scanf("%d",&M);
memset(tree,0,sizeof(tree));
memset(state,0,sizeof(state));
while(M--)
{
cin>>op;
if(op=="B")
{
scanf("%d%d",&x1,&y1);
x1++;
y1++;
if(state[x1][y1]!=1)
{
update(x1,y1,1);
state[x1][y1]=1;
}
}
else if(op=="D")
{
scanf("%d%d",&x1,&y1);
x1++;
y1++;
if(state[x1][y1]!=0)
{
update(x1,y1,-1);
state[x1][y1]=0;
}
}
else
{
scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
x1++;
y1++;
x2++;
y2++;
xmax=max(x1,x2);
ymax=max(y1,y2);
xmin=min(x1,x2);
ymin=min(y1,y2);
printf("%d/n",read(xmax,ymax)-read(xmax,ymin-1)-read(xmin-1,ymax)+read(xmin-1,ymin-1));
}
}
return 0;
}
 

继续加油吧!ac快乐!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tree 存储