poj2155

/* * poj2155.cpp * * Created on: 2010-8-7 * Author: friendy */ //每次只去改变给的位置和另外矩形顶点的位置 //举一个一维的例子,每次改变区间的端点,如果要求到点在这个之间,等到最后求1-x的和到时候,就会算一次,如果不在,有两种情况,无论是那个,两个 //改变的值相加对2取模是0所以和原来一样没有影响,这样就把求最后一个点改成了求和,更新的时候也是更新和。很好……很强大……& #include #include #include using 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; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值