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
题意很直白, 对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; }
相关文章推荐
- SpringMVC Maven项目 java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServle
- SVN 一次性提交多个目录中文件的方法
- ServiceStack 概念
- ServiceStack Web Service 创建与调用简单示列
- 数据结构与算法JavaScript (三) 链表
- 数据结构与算法JavaScript (二) 队列
- OpenJudge_P1481 Maximum sum(最大双子序列和)
- 创建文件夹
- Http、TCP/IP协议与Socket之间的区别
- android-service服务
- 在建好的项目中加入CoreData
- Android开发笔记(八)神奇的shape
- 设计模式
- memcached
- web app iphone4 iphone5 iphone6 响应式布局 适配代码
- C++实现离散余弦变换(参数为二维指针)
- vim: 搭建vim看代码的环境
- 数据结构与算法JavaScript (一) 栈
- java操作mongodb
- 遍历Map的方式总结