[BZOJ1452]JSOI2009 Count|树状数组

来源:互联网 发布:网络信息安全员证书 编辑:程序博客网 时间:2024/05/02 01:16

数据好小。。直接对每个颜色维护一个二维树状数组,不多说。。

#include<cstdio>#include<iostream>#define N 305#define C 105using namespace std;int n,m,Q,opt,col,x1,y1,x2,y2,i,j,c[C][N][N],a[N][N];int lowbit(int x){return x&-x;}void add(int x,int y,int old,int col){  for (int i=x;i<=n;i+=lowbit(i))    for (int j=y;j<=m;j+=lowbit(j))      c[col][i][j]++,c[old][i][j]--;}int getsum(int x,int y,int col){  int ans=0;  for (int i=x;i;i-=lowbit(i))    for (int j=y;j;j-=lowbit(j))      ans+=c[col][i][j];  return ans;}int main(){  freopen("1452.in","r",stdin);  scanf("%d%d",&n,&m);  for (col=1;col<=100;col++)    for (i=1;i<=n;i++)      for (j=1;j<=m;j++)      c[col][i][j]=0;  for (i=1;i<=n;i++)    for (j=1;j<=m;j++)    {      scanf("%d",&a[i][j]);      add(i,j,0,a[i][j]);    }  scanf("%d",&Q);  while (Q--)  {    scanf("%d",&opt);    if (opt==1)    {      scanf("%d%d%d",&x1,&y1,&col);      add(x1,y1,a[x1][y1],col);      a[x1][y1]=col;    }    else    {      scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&col);      printf("%d\n",getsum(x2,y2,col)-getsum(x1-1,y1-1,col)-getsum(x1-1,y2,col)-getsum(x2,y1-1,col));    }  }}


0 0