二维树状数组or树套树
树套树在bzoj上T了,在洛谷上AC了(卡着1000ms的上限跑的,交了n发才过)
二维树状数组跑的飞快
二维树状数组代码:
/**************************************************************
Problem: 1452
User: syh0313
Language: C++
Result: Accepted
Time:4672 ms
Memory:42960 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
using
namespace
std;
const
int
maxn=310;
int
n,m,q,col[maxn][maxn],a[110][maxn][maxn];
int
lowbit(
int
x){
return
x&(-x);}
void
add(
int
k,
int
x,
int
y,
int
kk)
{
while
(x<=n)
{
for
(
int
i=y;i<=m;i+=lowbit(i)) a[k][x][i]+=kk;
x+=lowbit(x);
}
}
int
qury(
int
kk,
int
x,
int
y)
{
int
sum=0;
while
(x)
{
for
(
int
i=y;i;i-=lowbit(i)) sum+=a[kk][x][i];
x-=lowbit(x);
}
return
sum;
}
int
main()
{
scanf
(
"%d%d"
,&n,&m);
for
(
int
i=1;i<=n;i++)
for
(
int
j=1;j<=m;j++)
{
scanf
(
"%d"
,&col[i][j]);
add(col[i][j],i,j,1);
}
scanf
(
"%d"
,&q);
while
(q--)
{
int
ff;
scanf
(
"%d"
,&ff);
if
(ff==1)
{
int
xx,yy,kk;
scanf
(
"%d%d%d"
,&xx,&yy,&kk);
add(col[xx][yy],xx,yy,-1);
add(kk,xx,yy,1); col[xx][yy]=kk;
}
else
{
int
x,xx,y,yy,kk;
scanf
(
"%d%d%d%d%d"
,&x,&xx,&y,&yy,&kk);
printf
(
"%d\n"
,qury(kk,xx,yy)-qury(kk,x-1,yy)-qury(kk,xx,y-1)+qury(kk,x-1,y-1));
}
}
return
0;
}
树套树洛谷AC代码:
|