Mosaic HDU 4819 二维线段树入门题
Mosaic
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)
Total Submission(s): 904 Accepted Submission(s): 394
God of sheep decides to pixelate some pictures (i.e., change them into
pictures with mosaic). Here's how he is gonna make it: for each picture,
he divides the picture into n x n cells, where each cell is assigned a
color value. Then he chooses a cell, and checks the color values in the L
x L region whose center is at this specific cell. Assuming the maximum
and minimum color values in the region is A and B respectively, he will
replace the color value in the chosen cell with floor((A + B) / 2).
Can you help the God of sheep?
Each
test case begins with an integer n (5 < n < 800). Then the
following n rows describe the picture to pixelate, where each row has n
integers representing the original color values. The j-th integer in the
i-th row is the color value of cell (i, j) of the picture. Color values
are nonnegative integers and will not exceed 1,000,000,000 (10^9).
After the description of the picture, there is an integer Q (Q ≤ 100000 (10^5)), indicating the number of mosaics.
Then
Q actions follow: the i-th row gives the i-th replacement made by the
God of sheep: xi, yi, Li (1 ≤ xi, yi ≤ n, 1 ≤ Li < 10000, Li is odd).
This means the God of sheep will change the color value in (xi, yi)
(located at row xi and column yi) according to the Li x Li region as
described above. For example, an query (2, 3, 3) means changing the
color value of the cell at the second row and the third column according
to region (1, 2) (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 2), (3,
3), (3, 4). Notice that if the region is not entirely inside the
picture, only cells that are both in the region and the picture are
considered.
Note that the God of sheep will do the replacement one by one in the order given in the input.��
For each action, print the new color value of the updated cell.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <iomanip>
#include <cstdlib>
#include <sstream>
using namespace std;
typedef long long LL;
const int INF=0x5fffffff;
const double EXP=1e-;
const int MS=;
int leafx[MS],leafy[MS];
int n;
struct nodey
{
int l,r,maxv,minv;
int mid()
{
return (l+r)>>;
}
}; struct nodex
{
int l,r;
nodey Y[MS<<];
int mid()
{
return (l+r)>>;
}
void build(int root,int l,int r)
{
Y[root].l=l;
Y[root].r=r;
Y[root].maxv=-INF;
Y[root].minv=INF;
if(l==r)
{
leafy[l]=root;
return ;
}
build(root<<,l,(l+r)/);
build(root<<|,(l+r)/+,r);
} int query_min(int root,int l,int r)
{
if(Y[root].l>=l&&Y[root].r<=r)
return Y[root].minv;
int mid=Y[root].mid();
if(r<=mid)
return query_min(root<<,l,r);
else if(l>mid)
return query_min(root<<|,l,r);
else
return min(query_min(root<<,l,mid),query_min(root<<|,mid+,r));
} int query_max(int root,int l,int r)
{
if(Y[root].l>=l&&Y[root].r<=r)
return Y[root].maxv;
int mid=Y[root].mid();
if(r<=mid)
return query_max(root<<,l,r);
else if(l>mid)
return query_max(root<<|,l,r);
else
return max(query_max(root<<,l,mid),query_max(root<<|,mid+,r));
}
}X[MS<<]; void build(int root,int l,int r)
{
X[root].l=l;
X[root].r=r;
X[root].build(,,n);
if(l==r)
{
leafx[l]=root;
return ;
}
build(root<<,l,(l+r)/);
build(root<<|,(l+r)/+,r);
} void updata(int x,int y,int value)
{
int tx=leafx[x];
int ty=leafy[y];
X[tx].Y[ty].minv=X[tx].Y[ty].maxv=value;
// push up
for(int i=tx;i;i>>=)
for(int j=ty;j;j>>=)
{
if(i==tx&&j==ty)
continue;
if(j==ty) // is leaf
{
X[i].Y[j].minv=min(X[i<<].Y[j].minv,X[i<<|].Y[j].minv);
X[i].Y[j].maxv=max(X[i<<].Y[j].maxv,X[i<<|].Y[j].maxv);
}
else
{
X[i].Y[j].minv=min(X[i].Y[j<<].minv,X[i].Y[j<<|].minv);
X[i].Y[j].maxv=max(X[i].Y[j<<].maxv,X[i].Y[j<<|].maxv);
}
}
} int query_min(int root,int x1,int x2,int y1,int y2)
{
if(X[root].l>=x1&&X[root].r<=x2)
return X[root].query_min(,y1,y2);
int mid=X[root].mid();
if(x2<=mid)
return query_min(root<<,x1,x2,y1,y2);
else if(x1>mid)
return query_min(root<<|,x1,x2,y1,y2);
return min(query_min(root<<,x1,mid,y1,y2),query_min(root<<|,mid+,x2,y1,y2));
} int query_max(int root,int x1,int x2,int y1,int y2)
{
if(X[root].l>=x1&&X[root].r<=x2)
return X[root].query_max(,y1,y2);
int mid=X[root].mid();
if(x2<=mid)
return query_max(root<<,x1,x2,y1,y2);
else if(x1>mid)
return query_max(root<<|,x1,x2,y1,y2);
return max(query_max(root<<,x1,mid,y1,y2),query_max(root<<|,mid+,x2,y1,y2));
} int main()
{
int T,x,y,z,Q;
scanf("%d",&T);
for(int k=;k<=T;k++)
{
scanf("%d",&n);
build(,,n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&x);
updata(i,j,x);
}
scanf("%d",&Q);
printf("Case #%d:\n",k);
while(Q--)
{
scanf("%d%d%d",&x,&y,&z);
int x1=max(x-z/,);
int x2=min(x+z/,n);
int y1=max(y-z/,);
int y2=min(y+z/,n);
int maxv=query_max(,x1,x2,y1,y2);
int minv=query_min(,x1,x2,y1,y2);
updata(x,y,(maxv+minv)>>);
printf("%d\n",(maxv+minv)>>);
}
}
return ;
}
Mosaic HDU 4819 二维线段树入门题的更多相关文章
- hdu 4819 二维线段树模板
/* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits ...
- HDU 4819 二维线段树
13年长春现场赛的G题,赤裸裸的二维线段树,单点更新,区间查询 不过我是第一次写二维的,一开始写T了,原因是我没有好好利用行段,说白一点,还是相当于枚举行,然后对列进行线段树,那要你写二维线段树干嘛 ...
- hdu1823(二维线段树模板题)
hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- POJ2155 Matrix二维线段树经典题
题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...
- HDU 1823 Luck and Love 二维线段树(树套树)
点击打开链接 Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU 4819 Mosaic (二维线段树&区间最值)题解
思路: 二维线段树模板题,马克一下,以后当模板用 代码: #include<cstdio> #include<cmath> #include<cstring> #i ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
- [hdu1823]Luck and Love(二维线段树)
解题关键:二维线段树模板题(单点修改.查询max) #include<cstdio> #include<cstring> #include<algorithm> # ...
随机推荐
- C# Common Keyword
[C# Common Keyword] 1.abstract Use the abstract modifier in a class declaration to indicate that a c ...
- [原创]Devexpress XtraReports 系列 6 创建并排报表
昨天我们已经介绍了如何创建交叉报表,详见:[原创]Devexpress XtraReports 系列 5 创建交叉报表 今天我们继续我们的XtraReports系列.Demo和数据库文件最后会附上. ...
- 研究QGIS二次开发笔记(一)
为了在QT程序中嵌入一个地图,最终选择了QGIS来干这件事.选型阶段真是呵呵.我折腾的是QGIS2.4.0. 首先,到官方网站下载安装QGIS.如果你跟我一样懒的话,可能希望下载一个已经编译好的win ...
- C#下实现的半角转与全角的互转
全角和半角的互转在C#下怎么实现呢? /// 转全角的函数(SBC case) /// ///任意字符串 ///全角字符串 /// ///全角空格为12288,半角空格为32 ///其他字符半角(33 ...
- 待整理 - Linux 下的VI命令大全
http://www.cnblogs.com/88999660/articles/1581524.html
- 隐马尔可夫模型(HMM)
转自:http://blog.csdn.net/likelet/article/details/7056068 隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. ...
- linux TCP数据包重传过程----小结
于TCP/IP协议栈的TCP协议的重传功能是由在linux内核源码(net/ipv4/tcp_output.c)中的函数tcp_retransmit_skb()实现的 代码如下: /* This re ...
- IE6常见bug整理
By Diaoyude | 发布时间: 09-08 09:47 | Hits:1,253 | Post in: WEB前端 , Div-Css 针对IE6常见的一些ie6bug,ie6png,E6 ...
- 关于document.referrer的使用需要注意
项目使用到一个场景,ajax请求返回无权限,跳回登录页面,登录后自动返回之前的浏览页,跳转由前端处理,于是想到document.referrer,但是对可靠性不确定,特意搜索了一下相关资料,大致整理如 ...
- mac下xampp简单虚拟主机配置
多域名,虚拟主机的配置 开启虚拟主机配置选项: 打开httpd.conf文件,找到httpd-vhosts.conf那一行,解除该行注释: 打开httpd-vhosts.conf文件 修改如下 < ...