hdu 4819 二维线段树模板
- /*
- 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 二维线段树模板的更多相关文章
- HDU 4819 二维线段树
13年长春现场赛的G题,赤裸裸的二维线段树,单点更新,区间查询 不过我是第一次写二维的,一开始写T了,原因是我没有好好利用行段,说白一点,还是相当于枚举行,然后对列进行线段树,那要你写二维线段树干嘛 ...
- Mosaic HDU 4819 二维线段树入门题
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- hdu1823(二维线段树模板题)
hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...
- HDU 4819 Mosaic (二维线段树&区间最值)题解
思路: 二维线段树模板题,马克一下,以后当模板用 代码: #include<cstdio> #include<cmath> #include<cstring> #i ...
- HDU1832 二维线段树求最值(模板)
Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Luck and Love(二维线段树)
Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- [hdu1823]Luck and Love(二维线段树)
解题关键:二维线段树模板题(单点修改.查询max) #include<cstdio> #include<cstring> #include<algorithm> # ...
- UVA 11297 Census ——二维线段树
[题目分析] 二维线段树模板题目. 简直就是无比的暴力.时间复杂度为两个log. 标记的更新方式比较奇特,空间复杂度为N^2. 模板题目. [代码] #include <cstdio> # ...
- HDU 4819 Mosaic(13年长春现场 二维线段树)
HDU 4819 Mosaic 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4819 题意:给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l) ...
随机推荐
- JS获取列表索引值
html部分 <ul id="test"> <li>111</li> <li>222</li> <li>33 ...
- System中关于Property的方法
System类在java.lang包中,所有方法都是静态的,里边有很多对系统的属性和控制方法 System类有三个成员变量:out-标准输出流(默认是控制台),in-标准输入流(默认是键盘),err- ...
- Master of Phi (欧拉函数 + 积性函数的性质 + 狄利克雷卷积)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6265 题目大意:首先T是测试组数,n代表当前这个数的因子的种类,然后接下来的p和q,代表当前这个数的因 ...
- MySQL删除数据几种情况以及是否释放磁盘空间【转】
MySQL删除数据几种情况以及是否释放磁盘空间: 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2.truncate table tabl ...
- 42.Trapping Rain Water---dp,stack,两指针
题目链接:https://leetcode.com/problems/trapping-rain-water/description/ 题目大意:与84题做比较,在直方图中计算其蓄水能力.例子如下: ...
- java在图片上写字
- linux下C语言编程,include的默认搜索路径
C语言编程时,发现细节的魅力很大.较为详细了看了一下关于include的知识,发现了几点新知: 1.include<头文件名>和include"头文件名" 如:incl ...
- ie6下png图片背景色处理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...
- csu 1552(米勒拉宾素数测试+二分图匹配)
1552: Friends Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 723 Solved: 198[Submit][Status][Web Bo ...