POJ-1656-Counting Black- 四分树
来源:互联网 发布:乐视高清直播软件 编辑:程序博客网 时间:2024/05/02 06:02
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); elseprintf("%d\n",query(0,1,100,1,100,x,x+L-1,y,y+L-1));} return 0; }
0 0
- POJ-1656-Counting Black- 四分树
- POJ 1656 Counting Black
- poj 1656 Counting Black
- POJ 1656 Counting Black
- poj 1656 Counting Black
- poj 1656 Counting Black
- poj 1656 Counting Black
- poj 1656 Counting Black
- poj 1656 Counting Black
- POJ 1656 Counting Black
- Poj 1656 Counting Black
- poj 1656 Counting Black 水题
- POJ 1656 Counting Black(水~)
- poj-1656-Counting Black-(树状数组)
- POJ-1565-Counting Black
- PKU 1656 Counting black
- 1656:Counting Black
- POJ-1656 Counting Black (二维树状数组 入门题)
- 按宽度自适应匹配imageview
- HTTP响应头和请求头信息对照表
- XML学习笔记(一):HTML文件转成XML文件
- Android 监听数据变化比较合理的写法总结
- Android Studio学习笔记3创建新窗口(activity)并进行跳转
- POJ-1656-Counting Black- 四分树
- 【Unity3D ugui】UI特效的位置自适应及调整层次关系的一种解决方案
- 初识Jenkins(一)
- CentOS 7默认的jdk 1.7升级方法(到1.8) - alternatives的功能
- 页面跳转与重定向(之二)
- License的攻与防
- re.MatchObject() Python
- 六款值得推荐的android(安卓)开源框架(包含下载链接)
- 开始iOS 7中自动布局教程(一)