您的位置:首页 > 其它

UVA 11297 线段树套线段树(二维线段树)

2016-03-30 15:29 423 查看
题目大意:

就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询

二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要 不同的处理方式,非叶子形成的线段树总是在自身的叶子处不能直接更新数据,而是要以一维下他的左右孩子对应的位置数据进行更新。

#include <bits/stdc++.h>
using namespace std;
#define N 505
#define ls o<<1
#define rs o<<1|1
#define def_m int m=(l+r)>>1
const int INF = 0x7fffffff;
int n , q , mx[N*3][N*3] , mn[N*3][N*3] , ansmx,ansmn,a

;
void update1D(int o , int l , int r , int y , int ox , int v,int flag)
{
if(l==r){
if(!flag)mx[ox][o] = mn[ox][o] = v;
else{mx[ox][o] = max(mx[ox<<1][o],mx[ox<<1|1][o]) ; mn[ox][o] = min(mn[ox<<1][o],mn[ox<<1|1][o]);}
return ;
}
def_m;
if(m>=y) update1D(ls,l,m,y,ox,v,flag);
else update1D(rs,m+1,r,y,ox,v,flag);
mx[ox][o] = max(mx[ox][ls] , mx[ox][rs]);
mn[ox][o] = min(mn[ox][ls] , mn[ox][rs]);
// cout<<ox<<" "<<o<<" "<<l<<" "<<r<<" "<<y<<" "<<v<<endl;
}
void update2D(int o , int l , int r , int x , int y , int v)
{
//  cout<<"v: "<<v<<endl;
if(l==r){
update1D(1,1,n,y,o,v,0);
return ;
}
def_m;
if(m>=x) update2D(ls,l,m,x,y,v);
else update2D(rs,m+1,r,x,y,v);
update1D(1,1,n,y,o,v,1);
}
void query1D(int o , int l , int r , int s , int t , int ox)
{
if(l>=s&&r<=t){
ansmx=max(ansmx,mx[ox][o]);
// cout<<"in query: "<<ox<<" "<<o<<" "<<s<<" "<<t<<" "<<mx[ox][o]<<" "<<mn[ox][o]<<endl;
ansmn=min(ansmn,mn[ox][o]);
return ;
}
def_m;
if(m>=s) query1D(ls,l,m,s,t,ox);
if(m<t) query1D(rs,m+1,r,s,t,ox);
}
void query2D(int o,int l,int r,int sx,int tx,int sy,int ty)
{
if(l>=sx&&r<=tx){
query1D(1,1,n,sy,ty,o);
return ;
}
def_m;
if(m>=sx) query2D(ls,l,m,sx,tx,sy,ty);
if(m<tx) query2D(rs,m+1,r,sx,tx,sy,ty);
}
void build1D(int o , int l , int r , int ox , int x)
{
if(l==r){
if(x>=0) mx[ox][o] = mn[ox][o] = a[x][l];
else mx[ox][o] = max(mx[ox<<1][o] , mx[ox<<1|1][o]) , mn[ox][o] = min(mn[ox<<1][o] , mn[ox<<1|1][o]);
return ;
}
def_m;
build1D(ls , l , m , ox , x);
build1D(rs , m+1 , r , ox , x);
mx[ox][o] = max(mx[ox][ls] , mx[ox][rs]);
mn[ox][o] = min(mn[ox][ls] , mn[ox][rs]);
}
void build2D(int o , int l , int r , int ly , int ry)
{
if(l==r){
build1D(1,1,n,o,l);
return ;
}
def_m;
build2D(ls , l , m , ly , ry);
build2D(rs , m+1 , r , ly , ry);
build1D(1 , 1 , n , o , -1);
}
int main()
{
// freopen("a.in" , "r" , stdin);
while(~scanf("%d" , &n)){
memset(mx , 0x80 , sizeof(mx));
memset(mn , 0x7f , sizeof(mn));
for(int i=1 ; i<=n ; i++)
for(int j=1 ; j<=n ; j++)scanf("%d" , &a[i][j]);

build2D(1,1,n,1,n);

scanf("%d" , &q);
for(int i=0 ; i<q ; i++){
char op[3];
scanf("%s" , op);
if(op[0]=='q'){
int x1,y1,x2,y2;
scanf("%d%d%d%d" , &x1,&y1,&x2,&y2);
ansmx = -INF , ansmn=INF;
query2D(1,1,n,x1,x2,y1,y2);
printf("%d %d\n" , ansmx,ansmn);
}
else{
int x,y,v;
scanf("%d%d%d" , &x,&y,&v);
update2D(1,1,n,x,y,v);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: