首页 > 代码库 > poj 2155 Matrix
poj 2155 Matrix
http://poj.org/problem?id=2155
题意:提供一个M*N的矩阵,其中每一个格子中的数不是1就是0,初始时每一个格子的值为0,我们可以修改这个矩阵中的数字,每次给出矩阵的左上角坐标(x1,y1),以及右下角的坐标(x2,y2),并且将矩阵中的数字全部取反(原来是1现在变成0,原来是0现在变成1),还可以每次查询第x行第y列的格子中的数字是什么。
思路:用树状数组,每次插入,在(x1,y1),(x1,y2+1),(x2+1,y1),(x2+1,y2+1)格子内加1,查询的时候求出sum(x,y)就可以。证明参考 <<浅谈信息学竞赛中的““0”和“1”>>这篇论文,作者:武森。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 20000 5 using namespace std; 6 7 int x; 8 int n,t; 9 int x1,y1,x2,y2;10 int c[1001][1001];11 12 int low_bit(int x)13 {14 return x&(-x);15 }16 17 void update(int x,int y,int m)18 {19 while(x<=n)20 {21 int yy=y;22 while(yy<=n)23 {24 c[x][yy]+=m;25 yy+=low_bit(yy);26 }27 x+=low_bit(x);28 }29 }30 31 int sum(int x,int y)32 {33 int sum1=0;34 while(x>=1)35 {36 int yy=y;37 while(yy>=1)38 {39 sum1+=c[x][yy];40 yy-=low_bit(yy);41 }42 x-=low_bit(x);43 }44 return sum1;45 }46 47 int main()48 {49 scanf("%d",&x);50 while(x--)51 {52 memset(c,0,sizeof(c));53 scanf("%d%d",&n,&t);54 getchar();55 for(int i=1; i<=t; i++)56 {57 char ch;58 scanf("%c",&ch);59 if(ch==‘C‘)60 {61 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);62 update(x1,y1,1);63 update(x1,y2+1,1);64 update(x2+1,y1,1);65 update(x2+1,y2+1,1);66 }67 else if(ch==‘Q‘)68 {69 scanf("%d%d",&x1,&y1);70 printf("%d\n",sum(x1,y1)%2);71 }72 getchar();73 }74 if(x>0) printf("\n");75 }76 return 0;77 }
poj 2155 Matrix
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。