bzoj1452[JSOI2009]Count 二维树状数组/树套树

来源:互联网 发布:手机淘宝不能登录原因 编辑:程序博客网 时间:2024/05/22 11:36

题意:求矩阵内某个权值出现次数,可修改。
明显树套树可做,太麻烦而且v<=100,三维数组暴力bit可以做。
不能算是标准的树状数组吧= =毕竟连求和都没用到。
注意空间开太大会T。

#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=305;typedef long long ll;int mp[N][N],sum[N][N];int t[110][N][N],n,m;inline int lowbit(int x){    return x&(-x);}inline void add(int i,int j,int c,int v){    for(int x=i;x<=n;x+=lowbit(x))        for(int y=j;y<=m;y+=lowbit(y))        t[c][x][y]+=v;}inline int ask(int x,int y,int c){    int ret=0;    for(int i=x;i;i-=lowbit(i))        for(int j=y;j;j-=lowbit(j))            ret+=t[c][i][j];    return ret;}int main(){    scanf("%d%d",&n,&m);    fo(i,1,n)    {        fo(j,1,m)        {            int x;            scanf("%d",&x);            mp[i][j]=x;            add(i,j,x,1);        }    }    int q;    scanf("%d",&q);    fo(i,1,q)    {        int op;        scanf("%d",&op);        int x1,x2,y1,y2,c;        if (op==1)        {            scanf("%d%d%d",&x1,&y1,&c);            add(x1,y1,mp[x1][y1],-1);            add(x1,y1,c,1);            mp[x1][y1]=c;        }        else        {            scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c);            int ans=ask(x2,y2,c)+ask(x1-1,y1-1,c);            ans=ans-ask(x1-1,y2,c)-ask(x2,y1-1,c);            printf("%d\n",ans);        }    }    return 0;}
原创粉丝点击