您的位置:首页 > 其它

POJ-1656-Counting Black- 四分树

2015-12-02 17:17 351 查看
http://poj.org/problem?id=1656

题意很直白, 对100*100的矩阵操作,

置位操作:每次把一个子矩阵置为0,或1,

查询操作:每次查询一个子矩阵的1个个数;

当然n只有100暴力是没问题的,如果n更大 就得用别的方法来写,下面这种 是四分树的写法:

二维线段树其实还是用一维时的思想。

一维的时候父区间分为两个子区间,那么二维的时候 也可以把一个父矩阵分为四个子矩阵。。。

最后发现....其实四分树也是蛮暴力的方法。。。 

空间复杂度感人 。。。 256N

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <vector>
using namespace std;

int sum[105*256],set[105*256];
void pushDown(int idx,int lx,int rx,int ly,int ry)
{
if (set[idx]==-1) return;
set[idx*4+1]=set[idx*4+2]=set[idx*4+3]=set[idx*4+4]=set[idx];
int mx=(lx+rx)>>1,my=(ly+ry)>>1;
sum[idx*4+1]=set[idx]*(mx-lx+1)*(my-ly+1);
sum[idx*4+2]=set[idx]*(mx-lx+1)*(ry-my);
sum[idx*4+3]=set[idx]*(rx-mx)*(my-ly+1);
sum[idx*4+4]=set[idx]*(rx-mx)*(ry-my);
set[idx]=-1;
}
void pushUp(int idx)
{
sum[idx]=sum[idx*4+1]+sum[idx*4+2]+sum[idx*4+3]+sum[idx*4+4];
}
void insert(int idx,int lx,int rx,int ly,int ry,int Lx,int Rx,int Ly,int Ry,int val )
{
if (Lx<=lx &&Rx>=rx &&Ly<=ly&&Ry>=ry)
{
set[idx]=val;
sum[idx]=val*(rx-lx+1)*(ry-ly+1);
return ;
}
pushDown(idx, lx, rx, ly, ry);
int mx=(lx+rx)>>1,my=(ly+ry)>>1;
if (Lx<=mx&&Ly<=my) insert(idx*4+1,lx,mx,ly,my,Lx,Rx,Ly,Ry,val);
if (Lx<=mx&&Ry>my) insert(idx*4+2,lx,mx,my+1,ry,Lx,Rx,Ly,Ry,val);
if (Rx>mx&&Ly<=my) insert(idx*4+3,mx+1,rx,ly,my,Lx,Rx,Ly,Ry,val);
if (Rx>mx&&Ry>my) insert(idx*4+4,mx+1,rx,my+1,ry,Lx,Rx,Ly,Ry,val);
pushUp(idx);
}
int query(int idx, int lx, int rx, int ly, int ry, int Lx, int Rx, int Ly, int Ry)
{
if (Lx<=lx &&Rx>=rx &&Ly<=ly&&Ry>=ry) return sum[idx];
pushDown(idx, lx, rx, ly, ry);
int mx=(lx+rx)>>1,my=(ly+ry)>>1,t=0;
if (Lx<=mx && Ly<=my) t+=query(idx*4+1,lx,mx,ly,my, Lx, Rx, Ly, Ry);
if (Lx<=mx && Ry>my)  t+=query(idx*4+2,lx,mx,my+1,ry, Lx, Rx, Ly, Ry);
if (Rx>mx && Ly<=my) t+=query(idx*4+3,mx+1,rx,ly,my, Lx, Rx, Ly, Ry);
if (Rx>mx && Ry>my ) t+=query(idx*4+4,mx+1,rx,my+1,ry, Lx, Rx, Ly, Ry);
return t;
}

int main()
{
int n,x,y,L,i;
char op[105];
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%s%d%d%d",op,&x,&y,&L);
if (op[0]=='B')
insert(0, 1, 100, 1, 100, x, x + L - 1, y, y + L - 1, 1);
else if (op[0]=='W')
insert(0, 1, 100, 1, 100, x, x + L - 1, y, y + L - 1, 0);
else
printf("%d\n",query(0,1,100,1,100,x,x+L-1,y,y+L-1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: