#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;
}
【BZOJ1452】【JSOI2009】Count 二维树状数组
原文:http://blog.csdn.net/vmurder/article/details/44559155