思路:

二维线段树模板题,马克一下,以后当模板用

代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 1024+5;
int MAX[N<<2][N<<2],MIN[N<<2][N<<2],n,minv,maxv;
void push_upx(int deep,int rt){
MAX[deep][rt] = max(MAX[deep<<1][rt],MAX[deep<<1|1][rt]);
MIN[deep][rt] = min(MIN[deep<<1][rt],MIN[deep<<1|1][rt]);
}
void push_upy(int deep,int rt){
MAX[deep][rt] = max(MAX[deep][rt<<1],MAX[deep][rt<<1|1]);
MIN[deep][rt] = min(MIN[deep][rt<<1],MIN[deep][rt<<1|1]);
}
void buildy(int ly,int ry,int deep,int rt,int flag){
//y轴范围ly,ry;deep,rt;标记flag
if(ly == ry){
if(flag){
int tmp;
scanf("%d",&tmp);
MAX[deep][rt] = MIN[deep][rt] = tmp;
}
else push_upx(deep,rt);
return;
}
int m = (ly + ry) >> 1;
buildy(ly,m,deep,rt << 1,flag);
buildy(m+1,ry,deep,rt << 1 | 1,flag);
push_upy(deep,rt);
}
void buildx(int lx,int rx,int deep){
//建树x轴范围lx,rx;deep
if(lx == rx){
buildy(1,n,deep,1,1);
return;
}
int m = (lx + rx) >> 1;
buildx(lx,m,deep << 1);
buildx(m+1,rx,deep << 1 | 1);
buildy(1,n,deep,1,0);
}
void updatey(int Y,int val,int ly,int ry,int deep,int rt,int flag){
//单点更新y坐标;更新值val;当前操作y的范围ly,ry;deep,rt;标记flag
if(ly == ry){
if(flag) MAX[deep][rt] = MIN[deep][rt] = val;
else push_upx(deep,rt);
return;
}
int m = (ly + ry) >> 1;
if(Y <= m) updatey(Y,val,ly,m,deep,rt << 1,flag);
else updatey(Y,val,m + 1,ry,deep,rt << 1 | 1,flag);
push_upy(deep,rt);
}
void updatex(int X,int Y,int val,int lx,int rx,int deep){
//单点更新范围x,y;更新值val;当前操作x的范围lx,rx;deep
if(lx == rx){
updatey(Y,val,1,n,deep,1,1);
return;
}
int m = (lx + rx) >> 1;
if(X <= m) updatex(X,Y,val,lx,m,deep << 1);
else updatex(X,Y,val,m + 1,rx,deep << 1 | 1);
updatey(Y,val,1,n,deep,1,0);
}
void queryy(int Yl,int Yr,int ly,int ry,int deep,int rt){
//询问区间y轴范围y1,y2;当前操作y的范围ly,ry;deep,rt
if(Yl <= ly && ry <= Yr){
minv = min(MIN[deep][rt],minv);
maxv = max(MAX[deep][rt],maxv);
return;
}
int m = (ly + ry) >> 1;
if(Yl <= m)
queryy(Yl,Yr,ly,m,deep,rt << 1);
if(m < Yr)
queryy(Yl,Yr,m + 1,ry,deep,rt << 1 | 1);
}
void queryx(int Xl,int Xr,int Yl,int Yr,int lx,int rx,int rt){
//询问区间范围x1,x2,y1,y2;当前操作x的范围lx,rx;rt
if(Xl <= lx && rx <= Xr){
queryy(Yl,Yr,1,n,rt,1);
return;
}
int m = (lx + rx) >> 1;
if(Xl <= m)
queryx(Xl,Xr,Yl,Yr,lx,m,rt << 1);
if(m < Xr)
queryx(Xl,Xr,Yl,Yr,m + 1,rx,rt << 1 | 1);
}
int main(){
int T,Case = 1;
scanf("%d",&T);
while(T--){
//memset(MAX,-1,sizeof(MAX));
//memset(MIN,63,sizeof(MIN));
scanf("%d",&n);
buildx(1,n,1);
int q,X,Y,r,odd,x1,x2,y1,y2;
scanf("%d",&q);
printf("Case #%d:\n",Case++);
while(q--){
maxv = -1,minv = 1000000005;
scanf("%d%d%d",&X,&Y,&odd);
r = odd >> 1;
x1 = max(X - r,1);    //注意一下范围
y1 = max(Y - r,1);
x2 = min(X + r,n);
y2 = min(Y + r,n);
queryx(x1,x2,y1,y2,1,n,1);
int ans = (maxv + minv) >> 1;
printf("%d\n",ans);
updatex(X,Y,ans,1,n,1);
}
}
return 0;
}

HDU 4819 Mosaic (二维线段树&区间最值)题解的更多相关文章

  1. HDU 4819 Mosaic --二维线段树(树套树)

    题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的 ...

  2. HDU 4819 Mosaic 二维线段树

    Mosaic Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  3. HDU 1823 Luck and Love (二维线段树&区间最值)题解

    思路: 树套树,先维护x树,再维护y树,多练练应该就能懂了 代码: #include<cstdio> #include<cmath> #include<cstring&g ...

  4. UVALive 6709 - Mosaic 二维线段树

    题目链接 给一个n*n的方格, 每个方格有值. 每次询问, 给出三个数x, y, l, 求出以x, y为中心的边长为l的正方形内的最大值与最小值, 输出(maxx+minn)/2, 并将x, y这个格 ...

  5. HDU1832 二维线段树求最值(模板)

    Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. HDU 4819 Mosaic(13年长春现场 二维线段树)

    HDU 4819 Mosaic 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4819 题意:给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l) ...

  7. HDU 4819 Mosaic (二维线段树)

    Mosaic Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total S ...

  8. HDU 4819 Mosaic 【二维线段树】

    题目大意:给你一个n*n的矩阵,每次找到一个点(x,y)周围l*l的子矩阵中的最大值a和最小值b,将(x,y)更新为(a+b)/2 思路:裸的二维线段树 #include<iostream> ...

  9. hdu 4819 二维线段树模板

    /* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits ...

随机推荐

  1. 两种JS事件流

    1.事件冒泡流(从注册事件元素到外侧容器元素的过程): 2.事件捕获流(与冒泡相反的过程):

  2. AndroidStudio 3.3+ ButterKnife R2 红名问题

    如果你一直用着ButterKnife,但是用的低版本(比如用得很多的8.4.0),然后在多module项目中一定知道要把R改成R2 然后最近如果升级AndroidStudio了,升到3.3以上(201 ...

  3. java连接数据库时的报错

    //java连接数据库时的报错 1 package Java数据库编程; import java.sql.DriverManager; import java.sql.SQLException; im ...

  4. javaScript高级教程(十) iframe

    1.iframe的基础,深入理解frame是何物,属性该如何设置. iframe即内联框架.不同于frame,frame与frameset综合使用,成为帧,框架集.frame已经不大使用了.说白了,f ...

  5. 从xtraback 备份文件中 单独恢复一张 innodb 表

    从xtraback 备份文件中 单独恢复一张 innodb 表 http://blog.sina.com.cn/s/blog_445e807b0101dbgw.html 能够恢复一张表的前提是独立表空 ...

  6. Win10+vs2012+cuda8.0的安装与配置

    安装环境说明:NVDIA GeForce 930M.Intel(R) HD Graphics 520 显卡和cuda需要兼容匹配,我一开始下载的cuda6.5无法安装,所以又重新下了比较新的cuda8 ...

  7. shell脚本变量$#,$*,$$,$@,$0,$1,$2,$?的含义

    本文转录:https://blog.csdn.net/kejiaming/article/details/51859503 参数说明: $# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该 ...

  8. numpy的prod()函数和pad()函数

    1.np.prod()函数用来计算所有元素的乘积,对于有多个维度的数组可以指定轴,如axis=1指定计算每一行的乘积. 2.np.lib.pad()函数用来把原来的list在原来的维度上进行扩展 例1 ...

  9. Leetcode: Binary Tree Postorder Transversal

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  10. 转载的 Linux下chkconfig命令详解

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...