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; }
相关文章推荐
- Linux CPU Topology
- 哲学最深处的东西是认识结构和模型
- TCP三次握手
- java基础Haep(堆)和Stack(栈)区别
- java基础Haep(堆)和Stack(栈)区别
- 关于SQL Server链接的问题
- phpcms修改伪静态
- var_list 格式化输出,Windows 和Linux
- js style.display=block显示布局错乱问题
- java基础Haep(堆)和Stack(栈)区别
- Android WebView中使用Java调用JavaScript方法并获取返回值
- ajax 传入值
- Zookeeper ZkClient简介
- 初识FreeMarker
- 时钟设置的关键性寄存器
- SMEM介绍
- 练习1-i
- LCS(求出最长公共子序列长度)
- 弱引用和软引用
- 状态模式