poj2155

来源:互联网 发布:发短信软件 编辑:程序博客网 时间:2024/05/22 07:51
/* * poj2155.cpp * * Created on: 2010-8-7 * Author: friendy *///每次只去改变给的位置和另外矩形顶点的位置//举一个一维的例子,每次改变区间的端点,如果要求到点在这个之间,等到最后求1-x的和到时候,就会算一次,如果不在,有两种情况,无论是那个,两个//改变的值相加对2取模是0所以和原来一样没有影响,这样就把求最后一个点改成了求和,更新的时候也是更新和。很好……很强大……&#include#include#includeusing namespace std;int a[1001][1001],n,m;//二维数组int lowbit(int x){return x&(-x);}//每次改变四个点int get(int x,int y){int i,j,res=0;for(i=x;i<=n;i+=lowbit(i)){for(j=y;j<=n;j+=lowbit(j)){res=(res+a[i][j])%2;}}return res;}void chang(int x,int y){int i,j;for(i=x;i>0;i-=lowbit(i)){for(j=y;j>0;j-=lowbit(j)){a[i][j]=(a[i][j]+1)%2;}}}int main(){int t,x1,x2,y1,y2;char ch;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(a,0,sizeof(a));getchar();while(m--){ch=getchar();if(ch=='C'){//去掉重复的scanf("%d%d%d%d",&x1,&y1,&x2,&y2);chang(x2,y2);chang(x1-1,y1-1);chang(x1-1,y2);chang(x2,y1-1);}else{scanf("%d%d",&x1,&y1);printf("%d/n",get(x1,y1));}getchar();}if(t>0)printf("/n");}return 0;}
原创粉丝点击