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

这道题同HDU 1892 有很大的相同点,但是更加简单!所以没有什么太大的难度!

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

话不多说看代码:

#include 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快乐!

你可能感兴趣的:(HDU 2642 Stars 简单二维树状数组应用)