树状数组(二维)例题 HDU2642——Stars

来源:互联网 发布:linux tomcat 改端口 编辑:程序博客网 时间:2024/05/22 17:22





//输入B后输入坐标,表示对应的点的灯变亮//输入D后输入坐标表示对应的点灯灭//输入Q后输入一个矩形的左下角和右上角 输出矩形内亮着的等的个数//注:灯亮过不能再亮,灯关了不能再关,所以用数组标记//注:树状数组模板中:元素下标均从1开始,题目从0开始所以加1#include<stdio.h>#include<string.h>#include<algorithm>#include<stdlib.h>#include<iostream>#include<math.h>#include<map>#include<queue>using namespace std;#define maxn 1010#define INF 0x3f3f3f3fint vis[maxn][maxn];int c[maxn][maxn];int lowbit(int x){     return x&(-x);}void add(int x,int y,int val){     for(int i=x;i<=maxn;i+=lowbit(i))     {          for(int j=y;j<=maxn;j+=lowbit(j))          {               c[i][j]+=val;          }     }}int sum(int x,int y){     int s=0;     for(int i=x;i>0;i-=lowbit(i))     {          for(int j=y;j>0;j-=lowbit(j))          {               s+=c[i][j];          }     }     return s;}int main(){     int m,x1,x2,y1,y2;     char str[5];     scanf("%d",&m);          memset(vis,0,sizeof(vis));          memset(c,0,sizeof(c));          while(m--)          {               scanf("%s",str);               if(str[0]=='Q')               {                   scanf("%d%d%d%d",&x1,&x2,&y1,&y2);                   x1++;x2++;y1++;y2++;                   if(x1>x2){int tmp=x1;x1=x2;x2=tmp;}                   if(y1>y2){int tmp=y1;y1=y2;y2=tmp;}                   int ans=sum(x2,y2)-sum(x2,y1-1)-sum(x1-1,y2)+sum(x1-1,y1-1);                   printf("%d\n",ans);               }               else if(str[0]=='B')               {                    scanf("%d%d",&x1,&y1);                    x1++;y1++;                    if(vis[x1][y1]==1) continue;                    vis[x1][y1]=1;                    add(x1,y1,1);               }               else if(str[0]=='D')               {                    scanf("%d%d",&x1,&y1);                    x1++;y1++;                    if(vis[x1][y1]==0) continue;                    vis[x1][y1]=0;                    add(x1,y1,-1);               }          }     return 0;}


0 0