基础题……写完代码,却发现样例都过不了,找了N久的错, 也没发现哪出问题了, 再仔细一看题,发现查询时是先输入两个横坐标,再输入两个纵坐标,而不是先输入一个点的坐标,再输入一个点的坐标……无语……
#include<stdio.h> #include<string.h> #define MAX 1001 int c[1003][1003], bright[1003][1003]; int max(int a, int b) { return a>b?a:b; } int min(int a, int b) { return a<b?a:b; } void update(int x, int y, int data) { for(int i=x ; i<=MAX; i+=i&(-i)) for(int j=y ; j<=MAX; j+=j&(-j)) c[i][j]+=data; } int query(int x,int y) { int sum=0; for(int i=x ; i>0; i-=i&(-i)) for(int j=y ; j>0; j-=j&(-j)) sum+=c[i][j]; return sum; } int main() { int m, ans, x, y, x1, y1, x2, y2; int xmax, ymax, xmin, ymin; char s; scanf("%d", &m); memset(c,0,sizeof(c)); memset(bright,0,sizeof(bright)); while( m-- ) { getchar(); scanf("%c",&s); if( s=='B') { scanf("%d %d",&x, &y); if( !bright[++x][++y])//如果是暗的,就改为亮的 { update(x, y, 1); bright[x][y]=1; } } else if(s=='D') { scanf("%d %d",&x, &y); if( bright[++x][++y])//如果是暗的,就改为亮的 { update(x, y, -1); bright[x][y]=0; } } else { scanf("%d %d %d %d",&x1, &x2, &y1, &y2); x1++; y1++; x2++; y2++; xmax=max(x1,x2);ymax=max(y1,y2);xmin=min(x1,x2);ymin=min(y1,y2); ans=query(xmax,ymax)+query(xmin-1,ymin-1)-query(xmax,ymin-1)-query(xmin-1,ymax); printf("%d\n", ans); } } }