POJ-1565-Counting Black
2013-07-29 14:10
162 查看
题目大意是说给你一个初始全为白色的矩阵,然后每次有3种操作(1、将矩阵x,y->x+l-1,y+l-1全部变为染黑 2、将矩阵x,y->x+l-1,y+l-1全部变为染白 3、求矩阵x,y->x+l-1,y+l-1中含有多少个白色)
用二维树状数组可以完成,对于染色分别更新1和-1,注意如果当前颜色与更新颜色相同,则不需要更新
代码:
用二维树状数组可以完成,对于染色分别更新1和-1,注意如果当前颜色与更新颜色相同,则不需要更新
代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=101; int n,t[maxn][maxn],color[maxn][maxn]; int lowbit(int x) { return x&(-x); } void Update(int row,int col,int val) { if(color[row][col]==val) return; color[row][col]=val; for(int i=row;i<maxn;i+=lowbit(i)) for(int j=col;j<maxn;j+=lowbit(j)) t[i][j]+=val; } int Sum(int row,int col) { int ans=0; for(int i=row;i>0;i-=lowbit(i)) for(int j=col;j>0;ans+=t[i][j],j-=lowbit(j)); return ans; } int main() { scanf("%d",&n); memset(color,-1,sizeof(color)); while(n--) { char op[10]; int x,y,l; scanf("%s%d%d%d",op,&x,&y,&l); if(op[0]=='B') for(int i=x;i<x+l;i++) for(int j=y;j<y+l;j++) Update(i,j,1); else if(op[0]=='W') for(int i=x;i<x+l;i++) for(int j=y;j<y+l;j++) Update(i,j,-1); else printf("%d\n",Sum(x+l-1,y+l-1)-Sum(x-1,y+l-1)-Sum(x+l-1,y-1)+Sum(x-1,y-1)); } return 0; }
相关文章推荐
- POJ 1565:Skew Binary
- poj 1656 Counting Black
- POJ 1565 水 模拟
- POJ 1565:Skew Binary
- POJ 1656 Counting Black(我的水题之路——表格涂色)
- POJ 1565(DP状态压缩)
- poj 1656 Counting Black
- POJ1565 水题
- POJ 1565 Skew Binary(简单题)
- OpenJudge / Poj 1565 Skew Binary C++
- poj1565-Skew Binary
- poj 1565 题目说啥你就做啥!
- poj-1565
- POJ 1656 Counting Black
- poj-1656 Counting Black
- POJ 1656 Counting Black(水~)
- poj 1656 Counting Black
- poj-1656-Counting Black-(树状数组)
- poj 1565 Skew Binary
- poj 1656 Counting Black