/*
HDU 4819 Mosaic
题意:查询某个矩形内的最大最小值,
修改矩形内某点的值为该矩形(Mi+MA)/2;
二维线段树模板:
区间最值,单点更新。
*/
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = ;
int N, Q;
struct Nodey
{
int l, r;
int Max, Min;
};
int locx[MAXN], locy[MAXN];
struct Nodex
{
int l, r;
Nodey sty[MAXN * ];
void build(int i, int _l, int _r)
{
sty[i].l = _l;
sty[i].r = _r;
sty[i].Max = -INF;
sty[i].Min = INF;
if(_l == _r)
{
locy[_l] = i;
return;
}
int mid = (_l + _r) / ;
build(i << , _l, mid);
build((i << ) | , mid + , _r);
}
int queryMin(int i, int _l, int _r)
{
if(sty[i].l == _l && sty[i].r == _r)
return sty[i].Min;
int mid = (sty[i].l + sty[i].r) / ;
if(_r <= mid)
return queryMin(i << , _l, _r);
else if(_l > mid)
return queryMin((i << ) | , _l, _r);
else
return min(queryMin(i << , _l, mid), queryMin((i << ) | , mid + , _r));
}
int queryMax(int i, int _l, int _r)
{
if(sty[i].l == _l && sty[i].r == _r)
return sty[i].Max;
int mid = (sty[i].l + sty[i].r) / ;
if(_r <= mid)
return queryMax(i << , _l, _r);
else if(_l > mid)
return queryMax((i << ) | , _l, _r);
else
return max(queryMax(i << , _l, mid), queryMax((i << ) | , mid + , _r));
}
} stx[MAXN * ];
void build(int i, int l, int r)
{
stx[i].l = l;
stx[i].r = r;
stx[i].build(, , N);
if(l == r)
{
locx[l] = i;
return;
}
int mid = (l + r) / ;
build(i << , l, mid);
build((i << ) | , mid + , r);
}
//单点修改值
void Modify(int x, int y, int val)
{
int tx = locx[x];
int ty = locy[y];
stx[tx].sty[ty].Min = stx[tx].sty[ty].Max = val;
for(int i = tx; i; i >>= )
for(int j = ty; j; j >>= )
{
if(i == tx && j == ty)continue;
if(j == ty)
{
stx[i].sty[j].Min = min(stx[i << ].sty[j].Min, stx[(i << ) | ].sty[j].Min);
stx[i].sty[j].Max = max(stx[i << ].sty[j].Max, stx[(i << ) | ].sty[j].Max);
}
else
{
stx[i].sty[j].Min = min(stx[i].sty[j << ].Min, stx[i].sty[(j << ) | ].Min);
stx[i].sty[j].Max = max(stx[i].sty[j << ].Max, stx[i].sty[(j << ) | ].Max);
}
}
} int queryMin(int i, int x1, int x2, int y1, int y2)
{
if(stx[i].l == x1 && stx[i].r == x2)
return stx[i].queryMin(, y1, y2);
int mid = (stx[i].l + stx[i].r) / ;
if(x2 <= mid)
return queryMin(i << , x1, x2, y1, y2);
else if(x1 > mid)
return queryMin((i << ) | , x1, x2, y1, y2);
else
return min(queryMin(i << , x1, mid, y1, y2), queryMin((i << ) | , mid + , x2, y1, y2));
}
int queryMax(int i, int x1, int x2, int y1, int y2)
{
if(stx[i].l == x1 && stx[i].r == x2)
return stx[i].queryMax(, y1, y2);
int mid = (stx[i].l + stx[i].r) / ;
if(x2 <= mid)
return queryMax(i << , x1, x2, y1, y2);
else if(x1 > mid)
return queryMax((i << ) | , x1, x2, y1, y2);
else
return max(queryMax(i << , x1, mid, y1, y2), queryMax((i << ) | , mid + , x2, y1, y2));
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T, ic = ;
scanf("%d", &T);
while(T--)
{
printf("Case #%d:\n", ++ic);
scanf("%d", &N);
build(, , N);
for(int i = ; i <= N; i++)
for(int j = ; j <= N; j++)
{
int a;
scanf("%d", &a);
Modify(i, j, a);
}
scanf("%d", &Q);
while(Q--)
{
int x, y, L;
scanf("%d%d%d", &x, &y, &L);
int x1 = max(x - L / , );
int x2 = min(x + L / , N);
int y1 = max(y - L / , );
int y2 = min(y + L / , N);
//(x1,y1)左上角,(x2,y2)右下角
int Max = queryMax(, x1, x2, y1, y2);
int Min = queryMin(, x1, x2, y1, y2);
int t = (Max + Min) / ;
printf("%d\n", t);
Modify(x, y, t);//单点修改
}
}
return ;
}

hdu 4819 二维线段树模板的更多相关文章

  1. HDU 4819 二维线段树

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

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

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

  3. hdu1823(二维线段树模板题)

    hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...

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

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

  5. HDU1832 二维线段树求最值(模板)

    Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. Luck and Love(二维线段树)

    Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. [hdu1823]Luck and Love(二维线段树)

    解题关键:二维线段树模板题(单点修改.查询max) #include<cstdio> #include<cstring> #include<algorithm> # ...

  8. UVA 11297 Census ——二维线段树

    [题目分析] 二维线段树模板题目. 简直就是无比的暴力.时间复杂度为两个log. 标记的更新方式比较奇特,空间复杂度为N^2. 模板题目. [代码] #include <cstdio> # ...

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

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

随机推荐

  1. [译]Quartz.Net 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails

    第三课 更多关于Jobs和JobDetails 在这二课我们已经学习到,Jobs接口非常容易实现,只有一个execute方法.我们需要再学习一些知识去理解jobs的本质,Job接口的execute方法 ...

  2. IntelliJ Idea key shortcuts

    >Default explaination Official IntelliJ Idea 常用快捷键列表 Shortcuts Ctrl+Shift + Enter,语句完成 "!&qu ...

  3. eclipse运行Android项目出现“The connection to adb is down, and a severe error has occured. You must restart adb and Eclipse. ”

    重启eclipse之后仍然出现同样错误,此时可以尝试一下方法: cmd打开命令窗口: 之后重启eclipse,基本可以解决问题!

  4. 爬虫实战--利用Scrapy爬取知乎用户信息

    思路: 主要逻辑图:

  5. Xcode下 gdb 调试命令

    Xcode的调试器为用户提供了一个GDB的图形化界面,GDB是GNU组织的开放源代码调试器.您可以在Xcode的图形界面里做任何事情:但是,如果您需要您可以在命令行里使用GDB的命令,且gdb可以在终 ...

  6. 去除IE10+上文本框巨丑无比的删除图标以及显示密码图标

    去除IE10+上文本框巨丑无比的删除图标以及显示密码图标 IE浏览器总是让人喜欢让人厌,在最新的IE浏览器(IE10+)上使用表单时,文本框内后面会出现很巨丑无比的“删除图标”以及“显示密码图标”,如 ...

  7. CRF++模板使用(转)

    CRF++模板构建分为两类,一类是Unigram标注,一类是Bigram标注. Unigram和Bigram模板分别生成CRF的状态特征函数  和转移特征函数  .其中  是标签,  是观测序列,   ...

  8. 使用SPLUNK进行简单Threat Hunting

    通过订阅网上公开的恶意ip库(威胁情报),与SIEM平台中网络流量日志进行匹配,获得安全事件告警. 比如,这里有一个malware urls数据下载的网站,每天更新一次: https://urlhau ...

  9. wget下载整个网站或特定目录

    下载整个网站或特定目录 wget -c -k -r -np -p http://www.yoursite.com/path -c, –continue 断点下载 -k, –convert-links ...

  10. tyvj P1050 最长公共子序列

    题目链接:http://tyvj.cn/p/1050 题解: 裸题,只是为了测试LCS模板写对没有…… #include<cstdio> #include<cstring> # ...