poj-2155(二维树状数组)
http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10491
题意:给出一组数据,初始值全部为0,再给出两个坐标,对在这范围之类的数据取反(1变为0,0变为1),在讯问一个点,输出那个点的值。
思路:二维树状数组,区间更新,单点求值,先将取反次数相加,在对2取余。
#include<iostream> using namespace std; #define max 1010 int c[max][max]; int lowbit(int x) { return x&(-x); } int getsum(int x,int y) { int i,j; int sum=0; for(i=x;i>0;i-=lowbit(i)) { for(j=y;j>0;j-=lowbit(j)) { sum+=c[i][j]; } } return sum; } void updata(int x,int y,int data) { int i,j; for(i=x;i<max;i+=lowbit(i)) { for(j=y;j<max;j+=lowbit(j)) { c[i][j]+=data; } } } int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); memset(c,0,sizeof(c)); for(int i=0;i<m;i++) { int x1,y1,x2,y2; char s[5]; scanf("%s",s); if(s[0]=='C') { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x2++; y2++; //因为x2这个点也要更新 updata(x1,y1,1); updata(x1,y2,-1); updata(x2,y1,-1); updata(x2,y2,1); } else { int x3,y3; scanf("%d%d",&x3,&y3); int sum; sum=getsum(x3,y3); sum%=2; printf("%d\n",sum); } } if(t!=0) printf("\n"); } }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。