【BZOJ1452】【JSOI2009】Count 二维树状数组

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/44559155");
}

题解:

暴力维护100个二维树状数组。

妈呀因为没测样例就交还RE一次(虽然显示是WA)

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 305
#define P 105
using namespace std;
int a[P][N][N],n,m,p;
inline int lowbit(int x){return x&-x;}
inline void add(int d,int x,int y,int z)
{
    while(x<=n)
    {
        int t=y;
        while(t<=m)
        {
            a[d][x][t]+=z;
            t+=lowbit(t);
        }
        x+=lowbit(x);
    }
}
inline int ask(int d,int x,int y)
{
    int ret=0;
    while(x)
    {
        int t=y;
        while(t)
        {
            ret+=a[d][x][t];
            t-=lowbit(t);
        }
        x-=lowbit(x);
    }
    return ret;
}
inline int query(int d,int x0,int x1,int y0,int y1)
{
    if(x0>x1)swap(x0,x1);
    if(y0>y1)swap(y0,y1);
    return ask(d,x1,y1)-ask(d,x0-1,y1)-ask(d,x1,y0-1)+ask(d,x0-1,y0-1);
}
int x[N][N];
int main()
{
    freopen("test.in","r",stdin);

    int i,j,k;
    int a,b,c,d;

    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)for(j=1;j<=m;j++)
    {
        scanf("%d",&x[i][j]);
        add(x[i][j],i,j,1);
    }
    scanf("%d",&p);
    while(p--)
    {
        scanf("%d",&k);
        if(k==1)
        {
            scanf("%d%d%d",&a,&b,&c);
            add(x[a][b],a,b,-1),x[a][b]=c,add(c,a,b,1);
        }
        else {
            scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
            printf("%d\n",query(k,a,b,c,d));
        }
    }
    return 0;
}

你可能感兴趣的:(count,二维树状数组,BZOJ1452,JSOI2009)