您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: