连接:

pid=4819">http://acm.hdu.edu.cn/showproblem.php?pid=4819

意:给出一个800×800下面的矩阵。每次更新一个点的值为以这个点为中心的长度为Li的矩阵内的最大值和最小值的平均值。而且输出这个值。

思路:线段树模板题。二维线段树就是一个树套树的情况。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb29vb29vb29l/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

题的意义就在于给我带了一个二维线段树的模板,跑了2359ms。结构体的线段树不会被卡。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>
#include <ctype.h>
#include <algorithm>
#include <string>
#include <set>
#define PI acos(-1.0)
#define maxn 1000
#define INF 0x7fffffff
#define eps 1e-16
#define MOD 1000000009
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
int x_pos[maxn],y_pos[maxn];
int n;//y最大范围
struct y_line
{
int left,right;
int Max,Min;
//int sum;
int mid(){return (left+right)>>1;}
};
struct x_line
{
int left,right;
y_line yy[maxn*4];
int mid(){return (left+right)>>1;}
void build_ytree(int i,int l,int r)
{
yy[i].Max=-INF;
yy[i].Min=INF;
yy[i].left=l;
yy[i].right=r;
if(l==r)
{
y_pos[l]=i;
return ;
}
build_ytree(i<<1,l,yy[i].mid());
build_ytree(i<<1|1,yy[i].mid()+1,r);
}
int query_Min(int i,int y1,int y2)
{
if(yy[i].left==y1&&yy[i].right==y2)
return yy[i].Min;
if(yy[i].mid()>=y2)
return query_Min(i<<1,y1,y2);
if(yy[i].mid()<y1)
return query_Min(i<<1|1,y1,y2);
return min(query_Min(i<<1,y1,yy[i].mid()),query_Min(i<<1|1,yy[i].mid()+1,y2));
}
int query_Max(int i,int y1,int y2)
{
if(yy[i].left==y1&&yy[i].right==y2)
return yy[i].Max;
if(yy[i].mid()>=y2)
return query_Max(i<<1,y1,y2);
if(yy[i].mid()<y1)
return query_Max(i<<1|1,y1,y2);
return max(query_Max(i<<1,y1,yy[i].mid()),query_Max(i<<1|1,yy[i].mid()+1,y2));
}
}xx[maxn*4];
void build_xtree(int i,int l,int r)
{
xx[i].left=l;
xx[i].right=r;
xx[i].build_ytree(1,1,n);
if(l==r)
{
x_pos[l]=i;
return ;
}
build_xtree(i<<1,l,xx[i].mid());
build_xtree(i<<1|1,xx[i].mid()+1,r);
}
void change(int x,int y,int num)
{
int x_p=x_pos[x],y_p=y_pos[y];
for(int i=x_p;i>0;i>>=1)
for(int j=y_p;j>0;j>>=1)
if(j==y_p&&i==x_p)
{
xx[i].yy[j].Max=xx[i].yy[j].Min=num;
}
else if(j==y_p)
{
xx[i].yy[j].Max=max(xx[i<<1].yy[j].Max,xx[i<<1|1].yy[j].Max);
xx[i].yy[j].Min=min(xx[i<<1].yy[j].Min,xx[i<<1|1].yy[j].Min);
}
else
{
xx[i].yy[j].Max=max(xx[i].yy[j<<1].Max,xx[i].yy[j<<1|1].Max);
xx[i].yy[j].Min=min(xx[i].yy[j<<1].Min,xx[i].yy[j<<1|1].Min);
}
}
int query_Min(int i,int x1,int y1,int x2,int y2)
{
if(xx[i].left==x1&&xx[i].right==x2)
return xx[i].query_Min(1,y1,y2);
if(xx[i].mid()>=x2)
return query_Min(i<<1,x1,y1,x2,y2);
if(xx[i].mid()<x1)
return query_Min(i<<1|1,x1,y1,x2,y2);
return min(query_Min(i<<1,x1,y1,xx[i].mid(),y2),query_Min(i<<1|1,xx[i].mid()+1,y1,x2,y2));
}
int query_Max(int i,int x1,int y1,int x2,int y2)
{
if(xx[i].left==x1&&xx[i].right==x2)
return xx[i].query_Max(1,y1,y2);
if(xx[i].mid()>=x2)
return query_Max(i<<1,x1,y1,x2,y2);
if(xx[i].mid()<x1)
return query_Max(i<<1|1,x1,y1,x2,y2);
return max(query_Max(i<<1,x1,y1,xx[i].mid(),y2),query_Max(i<<1|1,xx[i].mid()+1,y1,x2,y2));
}
int main()
{
int T,tot,c_x,c_y,r;
scanf("%d",&T);
for(int ii=1;ii<=T;ii++)
{
scanf("%d",&n);
build_xtree(1,1,n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int x;
scanf("%d",&x);
change(i,j,x);
}
scanf("%d",&tot);
printf("Case #%d:\n",ii);
for(int i=0;i<tot;i++)
{
scanf("%d%d%d",&c_x,&c_y,&r);
int a,b,c,d;
a=max(1,c_x-r/2);
b=max(1,c_y-r/2);
c=min(n,c_x+r/2);
d=min(n,c_y+r/2);
int t_min=query_Min(1,a,b,c,d);
int t_max=query_Max(1,a,b,c,d);
int t_need=(t_min+t_max)>>1;
change(c_x,c_y,t_need);
printf("%d\n",t_need);
}
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU 4819 Mosaic D区段树的更多相关文章

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

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

  2. hdu 4819 二维线段树模板

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

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

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

  4. HDU 4819 Mosaic 二维线段树

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

  5. hdu 4819 Mosaic 树套树 模板

    The God of sheep decides to pixelate some pictures (i.e., change them into pictures with mosaic). He ...

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

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

  7. Mosaic HDU 4819 二维线段树入门题

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

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

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

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

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

随机推荐

  1. 【Oracle】-【sqlplus / as sysdba登录报错问题】-新用户使用sqlplus / as sysdba登录报错

    刚才打开一个别人的测试库,用root登陆了的,sqlplus / as sysdba竟然报错,奇怪,于是在自己的VM中模拟该过程. 新建了一个test用户: [test@liu bin]# ./sql ...

  2. 用NMAKE创建VS2012 C++工程 HelloWorld

    由于需要精通GDAL的源代码,所以还是有必要精通NMAKE,先来尝试创建一个NMAKE工程. 之前一篇文章Windows7中Emacs 24 shell使用Gitbash已经介绍了如何在Emacs的s ...

  3. Windows phone 8 学习笔记(3) 通信

    原文:Windows phone 8 学习笔记(3) 通信 Windows phone 8 可利用的数据通信方式比较广泛,在硬件支持的前提下,我们可以利用WiFi.蓝牙.临近感应等多种方式.数据交互一 ...

  4. eclipse加入辅助线,配合代码格式化使用

  5. restrictkeyword

    今天在移植ffmpeg到opencore时出现一个编译错误: /libavcodec/dsputil.c:545: error: expected ';', ',' or ')' before 'bl ...

  6. 集成学习---bagging and boosting

    作为集成学习的二个方法,其实bagging和boosting的实现比较容易理解,但是理论证明比较费力.下面首先介绍这两种方法. 所谓的集成学习,就是用多重或多个弱分类器结合为一个强分类器,从而达到提升 ...

  7. Objective-C路成魔【18-复制对象】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 将一个变量 ...

  8. Emacs经常使用快捷键的注意事项

    一直用VIM,尝试了好几次Emacs都被它"多得像天上的星星"一样的快捷键给吓倒了.这几天最终下定决心再次尝试. 将它的Tutor练习了一下,顺便对经常使用快捷键做了一下笔记,方便 ...

  9. CentOS6.5解压缩文件.tar.gz .war .zip

    拉开拉链.tar.gz文件: tar -zxvf web.tar.gz tar将文件解压缩到一个指定的文件夹. 拉开拉链.war .zip文件到指定的文件夹: unzip web.war -d web ...

  10. 间隔DP基础 POJ2955——Brackets

    取血怒.first blood,第一区间DP,这样第一次没有以某种方式在不知不觉中下降~~~ 题目尽管是鸟语.但还是非常赤裸裸的告诉我们要求最大的括号匹配数.DP走起~ dp[i][j]表示区间[i, ...