思路:

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

代码:

#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. 【mlflow】执行import mlflow 报错:ImportError: No module named 'pkg_resources'

    命令行运行 python -c “import mlflow” 的时候报错: ImportError: No module named 'pkg_resources' 结果发现是因为本地有一个文件夹叫 ...

  2. AppFog使用

    cd ‘你的应用目录’ af login(之后输入你的邮箱和密码) af update ‘你的应用名’ 相关文档:https://docs.appfog.com/getting-started/af- ...

  3. 前端 HTML 常用标签 head标签相关内容

    HTML常用标签 head标签 我们首先来介绍一下head标签的主要内容和作用,文档的头部描述了文档的各种属性和信息,包括文档的标题.编码方式及URL等信息,这些信息大部分是用于提供索引,辩认或其他方 ...

  4. 前端 HTML body标签相关内容 常用标签 图片标签 <img/>

    图片标签 <img/> 一个网页除了有文字,还会有图片.我们使用<img/>标签在网页中插入图片. <img/> 是单闭合标签 语法:<img src=&qu ...

  5. css实现固定行

    如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来,当然还需要加宽度width属来兼容部分浏览. 实现方法: overflow: hidden; te ...

  6. 测试Celery 在Windows中搭建和使用的版本

    官网:http://docs.celeryproject.org/en/latest/faq.html#does-celery-support-windows 描述如下:表示Celery 4.0版本以 ...

  7. python中operator.itemgetter函数

    operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. k = [,,] b = ) print(b(k)) #输 ...

  8. lua的文件管理

    lua没有自己的文件管理 只有读取和写入文件,但是可以通过调用lfs(LuaFileSystem),lfs是一个 用于lua进行文件访问的库,支持lua5.1和lua5.2,并且跨平台 lfs的使用: ...

  9. collections模块(收藏)

    collections是Python内建的一个集合模块,提供了许多有用的集合类. 1. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >> ...

  10. AdaBoost Classifier和Regressor

    Adaboost原理传送门 AdaBoost在我看理论课程的时候,以分类为例子来讲解的,谁知道sklearn里面基本上都有classifier和regressor两种.这个倒是我没想到的!!! fro ...