HDU 4819 Mosaic 【二维线段树】
题目大意:给你一个n*n的矩阵,每次找到一个点(x,y)周围l*l的子矩阵中的最大值a和最小值b,将(x,y)更新为(a+b)/2
思路:裸的二维线段树
#include<iostream>
#include<cstdio>
#include <math.h>
#include<algorithm>
#include<string.h>
#include<queue>
#define MOD 10000007
#define maxn 3500
#define LL long long
using namespace std;
int tree_max[maxn][maxn],tree_min[maxn][maxn],ans_min,ans_max,n;
int a[maxn][maxn];
void build_y(int xx,int node,int l,int r,int x,int type)
{
if(l+1==r){
if(type)tree_max[xx][node]=tree_min[xx][node]=a[x][l];
else
{
tree_max[xx][node]=max(tree_max[xx*2][node],tree_max[xx*2+1][node]);
tree_min[xx][node]=min(tree_min[xx*2][node],tree_min[xx*2+1][node]);
}
return ;
}
int mid=(l+r)>>1;
build_y(xx,node*2,l,mid,x,type);
build_y(xx,node*2+1,mid,r,x,type);
tree_max[xx][node]=max(tree_max[xx][node*2],tree_max[xx][node*2+1]);
tree_min[xx][node]=min(tree_min[xx][node*2],tree_min[xx][node*2+1]);
}
void build_x(int node,int l,int r)
{
if(l+1==r)
{
build_y(node,1,1,n+1,l,1);
return ;
}
int mid=(l+r)>>1;
build_x(node*2,l,mid);
build_x(node*2+1,mid,r);
build_y(node,1,1,n+1,l,0);
}
void query_y(int xx,int node,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
ans_max=max(ans_max,tree_max[xx][node]);
ans_min=min(ans_min,tree_min[xx][node]);
return;
}
int mid=(l+r)>>1;
if(ql<mid)query_y(xx,node*2,l,mid,ql,qr);
if(qr>mid)query_y(xx,node*2+1,mid,r,ql,qr);
}
void query_x(int node,int l,int r,int ql,int qr,int y1,int y2)
{
if(ql<=l && r<=qr)
{
query_y(node,1,1,1+n,y1,y2);return ;
}
int mid=(l+r)>>1;
if(ql<mid)query_x(node*2,l,mid,ql,qr,y1,y2);
if(qr>mid)query_x(node*2+1,mid,r,ql,qr,y1,y2);
}
void update_y(int xx,int node,int l,int r,int pos,int num,int type){
if(l+1==r){
if(type)tree_max[xx][node]=tree_min[xx][node]=num;
else{
tree_max[xx][node]=max(tree_max[xx*2][node],tree_max[xx*2+1][node]);
tree_min[xx][node]=min(tree_min[xx*2][node],tree_min[xx*2+1][node]);
}
return ;
}
int mid=(l+r)>>1;
if(pos<mid)update_y(xx,node*2,l,mid,pos,num,type);else
update_y(xx,node*2+1,mid,r,pos,num,type);
tree_max[xx][node]=max(tree_max[xx][node*2],tree_max[xx][node*2+1]);
tree_min[xx][node]=min(tree_min[xx][node*2],tree_min[xx][node*2+1]);
}
void update_x(int node,int l,int r,int x,int y,int num)
{
if(l+1==r)
{
update_y(node,1,1,n+1,y,num,1);
return ;
}
int mid=(l+r)>>1;
if(x<mid)update_x(node*2,l,mid,x,y,num);
else update_x(node*2+1,mid,r,x,y,num);
update_y(node,1,1,n+1,y,num,0);
}
int main()
{
int t,cas=0;
scanf("%d",&t);
while(t--)
{
memset(tree_max,0,sizeof(tree_max));
memset(tree_min,0,sizeof(tree_min));
printf("Case #%d:\n",++cas);
int q,x,y,l;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);
build_x(1,1,n+1);
scanf("%d",&q);
while(q--)
{
scanf("%d%d%d",&x,&y,&l);l=(l-1)>>1;
ans_max=0;ans_min=0x3f3f3f3f;
query_x(1,1,n+1,max(x-l,1),min(x+l+1,n+1),max(y-l,1),min(y+l+1,n+1));
update_x(1,1,n+1,x,y,(ans_max+ans_min)>>1);
printf("%d\n",(ans_max+ans_min)>>1);
}
}
return 0;
}
HDU 4819 Mosaic 【二维线段树】的更多相关文章
- HDU 4819 Mosaic 二维线段树
Mosaic Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 4819 Mosaic --二维线段树(树套树)
题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的 ...
- UVALive 6709 - Mosaic 二维线段树
题目链接 给一个n*n的方格, 每个方格有值. 每次询问, 给出三个数x, y, l, 求出以x, y为中心的边长为l的正方形内的最大值与最小值, 输出(maxx+minn)/2, 并将x, y这个格 ...
- 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 (二维线段树&区间最值)题解
思路: 二维线段树模板题,马克一下,以后当模板用 代码: #include<cstdio> #include<cmath> #include<cstring> #i ...
- hdu 4819 二维线段树模板
/* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits ...
- HDU 4819 二维线段树
13年长春现场赛的G题,赤裸裸的二维线段树,单点更新,区间查询 不过我是第一次写二维的,一开始写T了,原因是我没有好好利用行段,说白一点,还是相当于枚举行,然后对列进行线段树,那要你写二维线段树干嘛 ...
- HDU 1823 Luck and Love(二维线段树)
之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...
随机推荐
- Azure 项目构建 – 部署 Drupal 网站
通过完整流程详细介绍了如何通过 Azure Web 应用. MySQL DB on Azure 等服务在 Azure 平台上快速搭建 Drupal 服务器,并将其连接到 MySQL 数据库. 此系列的 ...
- LeetCode Add and Search Word - Data structure design (trie树)
题意:实现添加单词和查找单词的作用,即实现字典功能. 思路:'.' 可以代表一个任何小写字母,可能是".abc"或者"a.bc"或者"abc.&quo ...
- An internal error occurred during: "Map/Reduce location status updater". java.lang.NullPointerException
eclipse配置hadoop 2.6 服务器做的虚拟机,因为window是的hadoop会出现意想不到的错误,因为,我做了ubuntu的虚拟机供我使用 在虚拟机中进行映射设置 在eclipse中dr ...
- Python 元组、字典、集合操作总结
元组 a=('a',) a=('a','b') 特点 有序 不可变,不可以修改元组的值,无法为元组增加或者删除元素 元组的创建 a=('a',) a=('a','b') tuple('abcd') 转 ...
- python 基础网络编程2
python 基础网络编程2 前一篇讲了socketserver.py中BaseServer类, 下面介绍下TCPServer和UDPServer class TCPServer(BaseServer ...
- 怎么在webstorm中设置代码模板
大家都知道webstorm对程序员来说是一个很好用的IDE.我们输入几个关键字,webstorm就会给出提示,大大提高了我们的开发效率,可有时候webstorm的默认设置不能满足我们的个性化代码模板的 ...
- 读懂 Deployment YAML【转】
既然要用 YAML 配置文件部署应用,现在就很有必要了解一下 Deployment 的配置格式,其他 Controller(比如 DaemonSet)非常类似. 还是以 nginx-deploymen ...
- bootstrap 按钮组的嵌套
您可以在一个按钮组内嵌套另一个按钮组,即,在一个 .btn-group 内嵌套另一个 .btn-group .当您想让下拉菜单与一系列按钮组合使用时,就会用到这个. 实例: <!DOCTYPE ...
- 嵌入式之:Linux下文件编译过程
本文主要三个部分:1.GNU GCC简介 2.C/C++交叉编译器arm-elf-gcc 3.make文件,用于工程管理 部分一:GNU GCC简介: 该编译器基本功能: (1)输出预处理后的文件(展 ...
- Linux 特殊权限位简介
suid.guid suid 针对二进制命令或者程序,让其拥有root或者属主权限执行 一.setsuid : chmod 4755 二进制命令或者程序 chmod u+s 二进制命令或者程序 示 ...