zoj Matrix Searching
2012-01-11 09:38
337 查看
这题是一道二维的线段树,有两种方式去建线段树,
一种是在母树中再建一棵子树,称为“树中树”,这种是比较耗空间的,当运行速率快!
另一种是“四分的思想(矩形树)”,这种是一维的,不怎么耗空间,但是时间慢!!
此题我用第一种建树
代码如下:
一种是在母树中再建一棵子树,称为“树中树”,这种是比较耗空间的,当运行速率快!
另一种是“四分的思想(矩形树)”,这种是一维的,不怎么耗空间,但是时间慢!!
此题我用第一种建树
代码如下:
#include<stdio.h> #include<algorithm> using namespace std; #define N 302 struct ctree { int l,r; int sum; }; struct ltree { int l,r; ctree node[4*N]; }tree[4*N]; int map ; int minn; int min(int a,int b) { if(a<b) return a; else return b; } void cbuild(int root,int step,int l,int r,int i) { tree[root].node[step].l=l; tree[root].node[step].r=r; if(l==r) { tree[root].node[step].sum=map[i][l]; return ; } int mid=(r+l)>>1; cbuild(root,step<<1,l,mid,i); cbuild(root,step<<1|1,mid+1,r,i); tree[root].node[step].sum=min(tree[root].node[step<<1].sum,tree[root].node[step<<1|1].sum); } void su_build(int root,int step,int l,int r) { tree[root].node[step].l=l; tree[root].node[step].r=r; if(l==r) { tree[root].node[step].sum=min(tree[root<<1].node[step].sum,tree[root<<1|1].node[step].sum); return ; } int mid=(l+r)>>1; su_build(root,step<<1,l,mid); su_build(root,step<<1|1,mid+1,r); tree[root].node[step].sum=min(tree[root<<1].node[step].sum,tree[root<<1|1].node[step].sum); } void build(int step,int l,int r,int cl,int cr) { tree[step].l=l; tree[step].r=r; if(l==r) { cbuild(step,1,cl,cr,l); return ; } int mid=(l+r)>>1; build(step<<1,l,mid,cl,cr); build(step<<1|1,mid+1,r,cl,cr); su_build(step,1,cl,cr); } void su_compute(int root,int step,int x2,int y2) { if(tree[root].node[step].l==x2&&tree[root].node[step].r==y2) { if(minn>tree[root].node[step].sum) { minn=tree[root].node[step].sum; } return ; } int mid=(tree[root].node[step].l+tree[root].node[step].r)>>1; if(y2<=mid) { su_compute(root,step<<1,x2,y2); } else { if(x2>mid) { su_compute(root,step<<1|1,x2,y2); } else { su_compute(root,step<<1,x2,mid); su_compute(root,step<<1|1,mid+1,y2); } } } void compute(int step,int x1,int y1,int x2,int y2) { if(tree[step].l==x1&&tree[step].r==y1) { su_compute(step,1,x2,y2); return ; } int mid=(tree[step].l+tree[step].r)>>1; if(y1<=mid) { compute(step<<1,x1,y1,x2,y2); } else { if(x1>mid) { compute(step<<1|1,x1,y1,x2,y2); } else { compute(step<<1,x1,mid,x2,y2); compute(step<<1|1,mid+1,y1,x2,y2); } } } int main() { int t,n,i,j,q,x1,x2,y1,y2; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&map[i][j]); build(1,1,n,1,n); scanf("%d",&q); while(q--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); minn=99999999; compute(1,x1,x2,y1,y2); printf("%d\n",minn); } } return 0; }
相关文章推荐
- zoj 1094 poj 2246 Matrix Chain Multiplication(堆栈)
- ZOJ 1094_Matrix Chain Multiplication
- POJ2246 HDU1082 ZOJ1094 UVA442 Matrix Chain Multiplication题解
- ZOJ-1094-Matrix Chain Multiplication
- zoj 3228 Searching the String(AC自动机)
- ZOJ 3228 Searching the String
- ZOJ 2418 Matrix
- ZOJ - 3228 Searching the String (AC自己主动机)
- zoj 3228 Searching the String (ac自动机)
- ZOJ 3228 Searching the String AC自动机的不重复匹配
- [ZOJ]3578 Matrix
- zoj1094 Matrix Chain Multiplication
- ZOJ-1094-Matrix Chain Multiplication
- zoj 3578 matrix
- ZOJ 1094 Matrix Chain Multiplication(map函数 模拟)
- ZOJ-1094-Matrix Chain Multiplication
- ZOJ3228---Searching the String(AC自动机)
- ZOJ 1094 Matrix Chain Multiplication
- ZOJ 1636 Evaluate Matrix Sum
- zoj1094 Matrix Chain Multiplication(模拟)