题目大意:

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

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

 #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*][N*] , mn[N*][N*] , ansmx,ansmn,a[N][N];
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<<][o],mx[ox<<|][o]) ; mn[ox][o] = min(mn[ox<<][o],mn[ox<<|][o]);}
return ;
}
def_m;
if(m>=y) update1D(ls,l,m,y,ox,v,flag);
else update1D(rs,m+,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(,,n,y,o,v,);
return ;
}
def_m;
if(m>=x) update2D(ls,l,m,x,y,v);
else update2D(rs,m+,r,x,y,v);
update1D(,,n,y,o,v,);
}
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+,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(,,n,sy,ty,o);
return ;
}
def_m;
if(m>=sx) query2D(ls,l,m,sx,tx,sy,ty);
if(m<tx) query2D(rs,m+,r,sx,tx,sy,ty);
}
void build1D(int o , int l , int r , int ox , int x)
{
if(l==r){
if(x>=) mx[ox][o] = mn[ox][o] = a[x][l];
else mx[ox][o] = max(mx[ox<<][o] , mx[ox<<|][o]) , mn[ox][o] = min(mn[ox<<][o] , mn[ox<<|][o]);
return ;
}
def_m;
build1D(ls , l , m , ox , x);
build1D(rs , m+ , 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(,,n,o,l);
return ;
}
def_m;
build2D(ls , l , m , ly , ry);
build2D(rs , m+ , r , ly , ry);
build1D( , , n , o , -);
}
int main()
{
// freopen("a.in" , "r" , stdin);
while(~scanf("%d" , &n)){
memset(mx , 0x80 , sizeof(mx));
memset(mn , 0x7f , sizeof(mn));
for(int i= ; i<=n ; i++)
for(int j= ; j<=n ; j++)scanf("%d" , &a[i][j]); build2D(,,n,,n); scanf("%d" , &q);
for(int i= ; i<q ; i++){
char op[];
scanf("%s" , op);
if(op[]=='q'){
int x1,y1,x2,y2;
scanf("%d%d%d%d" , &x1,&y1,&x2,&y2);
ansmx = -INF , ansmn=INF;
query2D(,,n,x1,x2,y1,y2);
printf("%d %d\n" , ansmx,ansmn);
}
else{
int x,y,v;
scanf("%d%d%d" , &x,&y,&v);
update2D(,,n,x,y,v);
}
}
}
return ;
}

UVA 11297 线段树套线段树(二维线段树)的更多相关文章

  1. 「ZJOI2017」树状数组(二维线段树)

    「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...

  2. [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)

    4785: [Zjoi2017]树状数组 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 297  Solved: 195[Submit][Status ...

  3. BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】

    题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...

  4. P3688 [ZJOI2017] 树状数组 【二维线段树】

    题目描述:这里有一个写挂的树状数组: 有两种共\(m\)个操作: 输入\(l,r\),在\([l,r]\)中随机选择一个整数\(x\)执行\(\text{Add}(x)\) 输入\(l,r\),询问执 ...

  5. 洛谷 P3688 - [ZJOI2017]树状数组(二维线段树+标记永久化)

    题面传送门 首先学过树状数组的应该都知道,将树状数组方向写反等价于前缀和 \(\to\) 后缀和,因此题目中伪代码的区间求和实质上是 \(sum[l-1...n]-sum[r...n]=sum[l-1 ...

  6. hdu1823(二维线段树模板题)

    hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...

  7. 【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树

    [BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维 ...

  8. UVa 11297 Census (二维线段树)

    题意:给定上一个二维矩阵,有两种操作 第一种是修改 c x y val 把(x, y) 改成 val 第二种是查询 q x1 y1 x2 y2 查询这个矩形内的最大值和最小值. 析:二维线段树裸板. ...

  9. UVA 11297 Census(二维线段树)

    Description This year, there have been many problems with population calculations, since in some cit ...

随机推荐

  1. C#的四种Timer介绍

    一.Timer的几个类别 1.System.Threading.Timer 2.System.Timers.Timer 3.System.Windows.Forms.Timer 4.System.Wi ...

  2. 读《编写可维护的JavaScript》第六章总结

    第六章 避免使用全局变量 JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一.“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文. 在浏览器中,windows对象往往重载 ...

  3. 30.Nginx集群搭建笔记

    源码安装Nginx: tar -zxvf nginx-1.8.0.tar.gz -C /nginx/        #解压Nginx rpm -ivh keepalived-1.2.13-5.el6_ ...

  4. 设置float之后vertical-align失效

    相关博文: 关于Vertical-Align你需要知道的事情 https://segmentfault.com/a/1190000002668492

  5. 巧用CSS3伪类选择器自定义checkbox和radio的样式

    由于原生的checkbox和radio的样式太简陋了,在设计页面的时候,设计师往往会设计自己的checkbox和radio样式.一半情况下,为了适应各个浏览器的兼容性,我们都会用其他的元素替代原生的c ...

  6. smarty模板中如何嵌入javascript脚本

    [官方网站](http://www.php100.com/manual/smarty/) 在smarty文件里直接写javascript代码时候,造成500错误. javascript代码有很多的{} ...

  7. Java分别与MySQL、Oracle、SQL Server数据库建立连接

    1.与MySQL连接 jar包下载地址: Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动(MySQL的jar包) String u ...

  8. 如何编写高质量的Javascript代码

    1.避免全局变量,因为全局变量容易发生名称上的冲突,可维护性不好. a,使用命名空间 b,使用闭包 c,在函数内部使用var声明 2.编写可维护的代码 a.可读性 b.连续性 c.预见性 d.看起来是 ...

  9. 学习_单片机/嵌入式_的资源链接。——Arvin

    ---恢复内容开始--- +单片机 -郭天祥的51单片机入门视频(链接: https://pan.baidu.com/s/1sl3xNDr 密码: 1zik) -51单片机20元购买资料公开(链接: ...

  10. 深入理解javascript系列,读书笔记

    深入理解JavaScript系列(2):揭秘命名函数表达式 1.讲了函数声明和函数表达式的区别,包括一些在函数提升上的区别 2.如果给函数表达式的函数也取名,会在调试的时候受益 3.不要在block( ...