HDU 4819 Mosaic (二维线段树&区间最值)题解
思路:
二维线段树模板题,马克一下,以后当模板用
代码:
#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 (二维线段树&区间最值)题解的更多相关文章
- HDU 4819 Mosaic --二维线段树(树套树)
题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的 ...
- HDU 4819 Mosaic 二维线段树
Mosaic Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 1823 Luck and Love (二维线段树&区间最值)题解
思路: 树套树,先维护x树,再维护y树,多练练应该就能懂了 代码: #include<cstdio> #include<cmath> #include<cstring&g ...
- UVALive 6709 - Mosaic 二维线段树
题目链接 给一个n*n的方格, 每个方格有值. 每次询问, 给出三个数x, y, l, 求出以x, y为中心的边长为l的正方形内的最大值与最小值, 输出(maxx+minn)/2, 并将x, y这个格 ...
- HDU1832 二维线段树求最值(模板)
Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 4819 Mosaic(13年长春现场 二维线段树)
HDU 4819 Mosaic 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4819 题意:给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l) ...
- HDU 4819 Mosaic (二维线段树)
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- HDU 4819 Mosaic 【二维线段树】
题目大意:给你一个n*n的矩阵,每次找到一个点(x,y)周围l*l的子矩阵中的最大值a和最小值b,将(x,y)更新为(a+b)/2 思路:裸的二维线段树 #include<iostream> ...
- hdu 4819 二维线段树模板
/* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits ...
随机推荐
- JS继承封装
<script> var extend = function (subClass, superClass) { //1.继承类的中间类 var Tmp = function() {}; / ...
- 原生js模仿下拉刷新功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [LeetCode] 182. Duplicate Emails_Easy tag: SQL
Write a SQL query to find all duplicate emails in a table named Person. +----+---------+ | Id | Emai ...
- 集成树模型使用自动搜索模块GridSearchCV,stacking
一. GridSearchCV参数介绍 导入模块: from sklearn.model_selection import GridSearchCV GridSearchCV 称为网格搜索交叉验证调参 ...
- selenium webdriver处理浏览器Cookie
有时候我们需要验证浏览器中是否存在某个cookie,因为基于真实的cookie 的测试是无法通过白盒和集成测试完成的.WebDriver 提供了操作Cookie 的相关方法可以读取.添加和删除cook ...
- iOS 设计模式-委托模式
委托是指给一个对象提供机会对另一对象中的变化做出反应或者相应另一个对象的行为.其基本思想是协同解决问题. Delegate的使用场合 对象A内部发生了一些事情,想通知对象B 对象B想监听对象A内部发生 ...
- unity3d-碰撞检测
碰撞检测 游戏中很多时候都要判断碰撞检测,比如子弹打中敌机.当碰撞后.就要发生爆炸. 或者敌机减血, 我们先看一张图片,看皮球从天空下落.与地面碰撞的过程 碰撞检测条件 游戏中两个对象发生碰撞是需要条 ...
- Linux其他: GitBash
git bash是Windows下的命令行工具 安装后在任何一个文件夹下右键GitBash,打开一个窗口,ssh root@xx.xxx.xxx.xx登陆到服务器,输入yes,和登陆密码可以使用敲命令 ...
- MyBatis学习笔记(五)——实现关联表查询
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创 ...
- MATLAB 简明教程
MATAB 是我学习和接触的第一种工具类的编程语言,最早可以追溯到大一上数学分析这门课的时候.MATLAB既是一种软件也是一门编程语言,MATLAB功能强大在理科和工科中运用较多. MATLAB 是 ...