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) ...
随机推荐
- [linux]linux下安装mysql
1.安装g++$sudo apt-get install build-essential注:此命令会同时安装gcc和make2.安装cmake$sudo apt-get install cmake3. ...
- 【洛谷P2515【HAOI2010】】软件安装
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- CodeForces - 1004B
Sonya decided to organize an exhibition of flowers. Since the girl likes only roses and lilies, she ...
- hdu 1498 50 years, 50 colors(二分匹配_匈牙利算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1498 50 years, 50 colors Time Limit: 2000/1000 MS (Ja ...
- 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】
转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...
- 去除\ufeff的解决方法,python语言
语言:python 编程工具:pycharm 硬件环境:win10 64位 读取文件过程中发现一个问题:已有记事本文件(非空),转码 UTF-8,复制到pycharm中,在开始位置打印结果会出现 \ ...
- Linux删除除了今天以外的文件
[背景] 开发到日志记录功能时,每天都会产生当天的一个日志,久而久之就会产生累积,想要查看的时候,tab键无法自动补全,还要自己额外输入. 比较麻烦. [命令] 经过查找和实验,找到了以下的方法: 1 ...
- angular项目中使用ngSemantic
npm install ng-semantic --save npm install jquery --save 下载 Official Semantic UI bundle ( .zip ) fro ...
- git版本控制系统常见操作总结
简介 Git是强大的版本控制系统,主要功能是针对代码.配置文件等文本进行版本控制.备份等,同时个人认为还是分发代码的一个不错的方式. 常见用法 #创建远程git仓库 [root@test88 ~]# ...
- 正则表达式对IP地址的限制
正则表达式 ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[ ...