5B 581 145B 581 145Q 0 600 0 200D 581 145Q 0 600 0 200 Sample Output10 題目大意: 二維空間里,初始時一片空白,有如下幾種操作: 1.B x y :將坐標為(x,y)的地方點亮 2.D x y :將坐標為(x,y)的地方熄滅 3. Q x x1 y y1 :查詢該矩形區域內點亮的星星個數 題解:樹狀數組模板 唯一坑點:當點(x,y)處已經點亮,則不再點亮 熄滅操作雷同。#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 1005int a[maxn][maxn],b[maxn][maxn];int lowbit(int x){ return x&-x;}void update(int x,int y,int z){ int i,j; for(i=x;i<=maxn;i+=lowbit(i)) for(j=y;j<=maxn;j+=lowbit(j)) a[i][j]+=z;}int query(int x,int y){ int sum=0,i,j; for(i=x;i>0;i-=lowbit(i)) for(j=y;j>0;j-=lowbit(j)) sum+=a[i][j]; return sum;}int main(){ int n,i,x,y,xx,yy; scanf("%d",&n); for(i=1;i<=n;i++) { char c[5]; scanf("%s",c); if(c[0]=='B') { scanf("%d%d",&x,&y); x++;y++; if(b[x][y]) continue; update(x,y,1); b[x][y]=1; } else if(c[0]=='D') { scanf("%d%d",&x,&y); x++;y++; if(!b[x][y]) continue; update(x,y,-1); b[x][y]=0; } else { scanf("%d%d%d%d",&x,&xx,&y,&yy); x++;y++; xx++;yy++; if(x<xx) swap(x,xx); if(y<yy) swap(y,yy); int ans=query(x,y)-query(x,yy-1)-(query(xx-1,y)-query(xx-1,yy-1)); printf("%d/n",ans); } }}
新聞熱點
疑難解答