HDU 4819 Mosaic

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4819

题意:给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l),求出该区域内的最大值(A)和最小值(B),输出(A+B)/2,并用这个值更新矩阵[x,y]的值

思路:裸的二维线段树,用树套树实现

# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std; # define lson l,m,rt<<
# define rson m+,r,rt<<|
# define MAXN
int xL,xR,yL,yR,val;
int maxv,minv;
int Max[MAXN<<][MAXN<<],Min[MAXN<<][MAXN<<];
int N,mat[MAXN][MAXN]; void PushUp(int xrt,int rt)
{
Max[xrt][rt]=max(Max[xrt][rt<<],Max[xrt][rt<<|]);
Min[xrt][rt]=min(Min[xrt][rt<<],Min[xrt][rt<<|]);
} void BuildY(int xrt,int x,int l,int r,int rt)
{
int m;
if(l==r)
{
if(x!=-) Max[xrt][rt]=Min[xrt][rt]=mat[x][l];
else
{
Max[xrt][rt]=max(Max[xrt<<][rt],Max[xrt<<|][rt]);
Min[xrt][rt]=min(Min[xrt<<][rt],Min[xrt<<|][rt]);
}
return;
}
m=(l+r)>>;
BuildY(xrt,x,lson);
BuildY(xrt,x,rson);
PushUp(xrt,rt);
} void BuildX(int l,int r,int rt)
{
int m;
if(l==r)
{
BuildY(rt,l,,N,);
return;
}
m=(l+r)>>;
BuildX(lson);
BuildX(rson);
BuildY(rt,-,,N,);
} void UpdateY(int xrt,int x,int l,int r,int rt)
{
int m;
if(l==r)
{
if(x!=-) Max[xrt][rt]=Min[xrt][rt]=val;
else
{
Max[xrt][rt]=max(Max[xrt<<][rt],Max[xrt<<|][rt]);
Min[xrt][rt]=min(Min[xrt<<][rt],Min[xrt<<|][rt]);
}
return;
}
m=(l+r)>>;
if(yL<=m) UpdateY(xrt,x,lson);
else UpdateY(xrt,x,rson);
PushUp(xrt,rt);
} void UpdateX(int l,int r,int rt)
{
int m;
if(l==r)
{
UpdateY(rt,l,,N,);
return;
}
m=(l+r)>>;
if(xL<=m) UpdateX(lson);
else UpdateX(rson);
UpdateY(rt,-,,N,);
} void QueryY(int xrt,int l,int r,int rt)
{
int m;
if(yL<=l&&yR>=r)
{
minv=min(minv,Min[xrt][rt]);
maxv=max(maxv,Max[xrt][rt]);
return;
}
m=(l+r)>>;
if(yL<=m) QueryY(xrt,lson);
if(yR>m) QueryY(xrt, rson);
} void QueryX(int l,int r,int rt)
{
int m;
if(xL<=l&&xR>=r)
{
QueryY(rt,,N,);
return;
}
m=(l+r)>>;
if(xL<=m) QueryX(lson);
if(xR>m) QueryX(rson);
} int main()
{
//freopen("in.txt","r",stdin);
int i,j,q,cas,T,x,y,l;
char op[];
scanf("%d",&T);
for(cas=;cas<=T;cas++)
{
scanf("%d",&N);
for(i=;i<=N;i++)
for(j=;j<=N;j++)
scanf("%d",&mat[i][j]);
BuildX(,N,);
scanf("%d",&q);
printf("Case #%d:\n",cas);
while(q--)
{
scanf("%d%d%d",&x,&y,&l);
l=(l+)/;
xL=max(,x-l+),xR=min(N,x+l-);
yL=max(,y-l+),yR=min(N,y+l-);
minv=<<,maxv=-(<<);
QueryX(,N,);
val=(maxv+minv)/;
xL=x,yL=y;
printf("%d\n",val);
UpdateX(,N,);
}
}
return ;
}

HDU 4819

HDU 4819 Mosaic(13年长春现场 二维线段树)的更多相关文章

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

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

  2. HDU 4819 Mosaic 二维线段树

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

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

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

  4. HDU 4819 Mosaic (二维线段树&区间最值)题解

    思路: 二维线段树模板题,马克一下,以后当模板用 代码: #include<cstdio> #include<cmath> #include<cstring> #i ...

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

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

  6. hdu 4819 二维线段树模板

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

  7. HDU 4819 二维线段树

    13年长春现场赛的G题,赤裸裸的二维线段树,单点更新,区间查询 不过我是第一次写二维的,一开始写T了,原因是我没有好好利用行段,说白一点,还是相当于枚举行,然后对列进行线段树,那要你写二维线段树干嘛 ...

  8. HDU 1823 Luck and Love(二维线段树)

    之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...

  9. UVALive 6709 - Mosaic 二维线段树

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

随机推荐

  1. WordPress怎么在页面上添加目录

    要实现的如下功能,在页面上添加一个文章目录: 步骤:   1)在wordpress中,在Posts----Categories中建立目录, 2) 3)add new post,指定post所属的cat ...

  2. BZOJ1722 [Usaco2006 Mar] Milk Team Select 产奶比赛

    直接树形dp就好了恩 令$f[i][j][t]$表示以$i$为根的子树,选出来的点存在$j$对父子关系,$t$表示$i$这个点选或者没选,的最大产奶值 分类讨论自己和儿子分别有没有选,然后转移一下就好 ...

  3. 如何理解java中的变量和常量

    int a =10;这是一个变量,在后面的代码中你可以去更改a的值但如果你在声明a的时候加上了final,那么a就成了常量,后面的代码是不允许对a做修改的.还有一点你要注意,被final修饰的常量必须 ...

  4. bzoj 1854: [Scoi2010]游戏

    #include<cstdio> #include<iostream> #include<cstring> #define M 2000008 using name ...

  5. PHP 长字符串替换操作性能(替换多换注释的代码)

    因为写一个css合并工具,去掉注释时,发现正则表达式很难写,最后,还是用php来实现吧,但是一不小心写出来的代码居然报内存超出可用的128m!! 原因是因为我找到/*和*/之后 $str=substr ...

  6. mac下安装apache+php+mysql

    运行“sudo apachectl start”,再输入帐号密码,这样Apache就运行了. 运行“sudo apachectl -v”,你会看到Mac OS X 10.6.3中的Apache版本号: ...

  7. windbg调试C#代码(二)

    这篇主要讲如何分析高内存和高CPU. 1.如何分析高内存 注:如果抓Dump的同时,刚好在执行GC,抓出来的Dump执行命令多半会出错,用!VerifyHeap也能验证Dump有误,这种情况只能重新抓 ...

  8. Ohlàlà

    Chap 1数数字 un 1 deux 2 trois 3 quatre 4 cinq 5 six 6 sept 7 huit 8 neuf 9 dix 10   Chap 2 讲地名 Paris 巴 ...

  9. Unity优化之减少Drawcall

    简单来说,Drawcall就是屏幕渲染一次所需要的开销,为了较少消耗,提高性能,一般有以下几种方法. 一: 批处理 1.动态批处理 如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处 ...

  10. Cygwin下载,安装教程

    Cygwin是一个用于在Windows上模拟Linux环境的软件,由于工作上的需要,我要使用它,至于为什么用它,我在这里不做过多的解释,本文的目的,旨在于解决Cygwin安装上的问题. 原始的安装Cy ...