[uva11992]Fast Matrix Operations(多延迟标记,二维线段树,区间更新)
题目链接:https://vjudge.net/problem/UVA-11992
题意:n*m的矩阵,每次对一个子矩阵操作,有三种操作:加x,设置为x,查询。查询返回子矩阵和、最小值、最大值
n很小(<=20),所以可以开20棵线段树,每次操作按行更新。
特别小心put和add两个延迟标记,坑老惨了。
put初始化-1最简单的坑,略过。
build的时候要每一个节点都要clear,不能只clear叶子。因为会有直接差没操作的子矩阵(因为初始化都是0)。
数组开大。。。
add的话,什么都不用管。
put的话,在update的时候要把那时候的add标记清空,不要忘记在向下传递的时候,也要清空!
上述几点都注意到,这题就能A。感觉写了一道模拟题。
#include <bits/stdc++.h>
using namespace std; #define lrt rt << 1
#define rrt rt << 1 | 1
typedef struct Node {
int lo, hi, sum;
int add, put;
}Node;
const int maxn = ;
const int maxm = ;
Node seg[maxn][maxm<<];
int n, m, q; void pushup(Node* seg, int rt) {
seg[rt].sum = seg[lrt].sum + seg[rrt].sum;
seg[rt].lo = min(seg[lrt].lo, seg[rrt].lo);
seg[rt].hi = max(seg[lrt].hi, seg[rrt].hi);
} void pushdown(Node* seg, int rt, int l, int r) {
int mid = (l + r) >> ;
if(seg[rt].put != -) {
seg[lrt].sum = (mid - l + ) * seg[rt].put;
seg[rrt].sum = (r - mid) * seg[rt].put;
seg[lrt].lo = seg[lrt].hi = seg[rt].put;
seg[rrt].lo = seg[rrt].hi = seg[rt].put;
seg[lrt].put = seg[rrt].put = seg[rt].put;
seg[lrt].add = seg[rrt].add = ;
seg[rt].put = -;
}
if(seg[rt].add) {
seg[lrt].sum += (mid - l + ) * seg[rt].add;
seg[rrt].sum += (r - mid) * seg[rt].add;
seg[lrt].lo += seg[rt].add;
seg[lrt].hi += seg[rt].add;
seg[rrt].lo += seg[rt].add;
seg[rrt].hi += seg[rt].add;
seg[lrt].add += seg[rt].add;
seg[rrt].add += seg[rt].add;
seg[rt].add = ;
}
} void build(Node* seg, int l, int r, int rt) {
seg[rt].lo = seg[rt].hi = seg[rt].sum = seg[rt].add = ;
seg[rt].put = -;
if(l == r) return;
int mid = (l + r) >> ;
build(seg, l, mid, lrt);
build(seg, mid+, r, rrt);
} void update(Node* seg, int L, int R, int l, int r, int rt, int val, int type) {
if(L <= l && r <= R) {
if(type == ) {
seg[rt].lo += val;
seg[rt].hi += val;
seg[rt].add += val;
seg[rt].sum += (r - l + ) * val;
}
else if(type == ) {
seg[rt].lo = val;
seg[rt].hi = val;
seg[rt].put = val;
seg[rt].sum = (r - l + ) * val;
seg[rt].add = ;
}
return;
}
pushdown(seg, rt, l, r);
int mid = (l + r) >> ;
if(L <= mid) update(seg, L, R, l, mid, lrt, val, type);
if(mid < R) update(seg, L, R, mid+, r, rrt, val, type);
pushup(seg, rt);
} Node query(Node* seg, int L, int R, int l, int r, int rt) {
if(L <= l && r <= R) return seg[rt];
pushdown(seg, rt, l, r);
int mid = (l + r) >> ;
Node ret;
ret.lo = 0x7f7f7f7f, ret.hi = , ret.sum = ;
if(L <= mid) {
Node tmp = query(seg, L, R, l, mid, lrt);
ret.lo = min(ret.lo, tmp.lo);
ret.hi = max(ret.hi, tmp.hi);
ret.sum += tmp.sum;
}
if(mid < R) {
Node tmp = query(seg, L, R, mid+, r, rrt);
ret.lo = min(ret.lo, tmp.lo);
ret.hi = max(ret.hi, tmp.hi);
ret.sum += tmp.sum;
}
pushup(seg, rt);
return ret;
} int main() {
// freopen("in", "r", stdin);
// freopen("out", "w", stdout);
int type, x1, y1, x2, y2, val;
while(~scanf("%d%d%d",&n,&m,&q)) {
for(int i = ; i <= n; i++) {
build(seg[i], , m, );
}
while(q--) {
scanf("%d%d%d%d%d",&type,&x1,&y1,&x2,&y2);
if(type == ) {
Node ret, tmp;
ret.lo = 0x7f7f7f7f, ret.hi = , ret.sum = ;
for(int i = x1; i <= x2; i++) {
tmp = query(seg[i], y1, y2, , m, );
ret.lo = min(ret.lo, tmp.lo);
ret.hi = max(ret.hi, tmp.hi);
ret.sum += tmp.sum;
}
printf("%d %d %d\n", ret.sum, ret.lo, ret.hi);
}
else {
scanf("%d", &val);
for(int i = x1; i <= x2; i++) {
update(seg[i], y1, y2, , m, , val, type);
}
}
}
}
return ;
}
[uva11992]Fast Matrix Operations(多延迟标记,二维线段树,区间更新)的更多相关文章
- HDU 4819 Mosaic (二维线段树&区间最值)题解
思路: 二维线段树模板题,马克一下,以后当模板用 代码: #include<cstdio> #include<cmath> #include<cstring> #i ...
- HDU 1823 Luck and Love (二维线段树&区间最值)题解
思路: 树套树,先维护x树,再维护y树,多练练应该就能懂了 代码: #include<cstdio> #include<cmath> #include<cstring&g ...
- UVA11992 - Fast Matrix Operations(段树部分的变化)
UVA11992 - Fast Matrix Operations(线段树区间改动) 题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- ZOJ 1859 Matrix Searching(二维线段树)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1859 Matrix Searching Time Limit: 10 Seco ...
- poj 2155 matrix 二维线段树 线段树套线段树
题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...
- 洛谷P3437 [POI2006]TET-Tetris 3D(二维线段树 标记永久化)
题意 题目链接 Sol 二维线段树空间复杂度是多少啊qwqqq 为啥这题全网空间都是\(n^2\)还有人硬要说是\(nlog^2n\)呀.. 对于这题来说,因为有修改操作,我们需要在外层线段树上也打标 ...
- bzoj 1513 POI2006 Tet-Tetris 3D 二维线段树+标记永久化
1511: [POI2006]OKR-Periods of Words Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 351 Solved: 220[S ...
随机推荐
- ubuntu firefox上看视频,安装flash啊
这是针对于直接硬盘安装的linux系统: u盘安装选择了安装第三方软件的话就不会存在这种问题 flash的安装其实也不是很难的,有点耐心就ok了 总结一下: 1:肯定是下载最新版的flash啦,注意看 ...
- [LeetCode] 01 Matrix 题解
题意 # 思路 我一开始的时候想的是嘴 # 实现 ```cpp // // include "../PreLoad.h" class Solution { public: /** ...
- 用js控制css属性
在用js控制css属性时,行内css属性可以任意控制,但若是在<style></style>中写的css属性,均不能用alert读取,但是赋值却有几种现象, 第一种:无法读取, ...
- ios 个推推送集成
个推推送总结: 个推第三方平台官网地址:http://www.getui.com/cn/index.html 首先去官网注册账号,创建应用,应用的配置信息,创建APNs推送证书上传 P12证书(开发对 ...
- c#中遍历各种数据集合的方法
1.遍历枚举类型 补:typeof()方法中只能传具体的类名.类型名称(int32...),不可以是变量名称.类似的方法有GetType(),GteType()方法继承自object,所以c#中任何对 ...
- pyqt样式表语法笔记
pyqt样式表语法笔记 pyqt QSS python 样式表 因为软件课设的原因开始学习使用pyqt4,才发现原来它也有样式表,而且语法跟css基本相同,而且一些功能实现起来感觉比js要简单方便得多 ...
- WEB开发性能优化--核心定义介绍篇(1)
推荐理由 随着 互联网的蓬勃发展,并且伴随着产品功能的越来越复杂,对于技术人员来说最大的挑战就是如何在保证业务快速发展的同时,也可保证不断复杂的业务对用户体验的影响,其中对用户来说最重要的体验指标是如 ...
- python 调取 shell 命令的几种方法
os.system()无法获得到输出和返回值 os.popen()output = os.popen('cat /proc/cpuinfo')print output.read()返回的是 file ...
- unity传送门类似效果实现
简述 在传送门中,核心的玩法是在地上或者墙上打开2个可以联通的洞来实现传送的效果.以此扩展加入解谜要素构成游戏的核心. 这里尝试使用unity来实现传送门的核心功能,具体功能分析如下: 1.传送门的模 ...
- 如何把phpStorm打造成自己的专属IDE
1.如何设置phpStorm的默认编码,例如UTF-8?phpStorm的编码分为IDE Encoding 和Project Encoding,设置方法是打开File->Setting-> ...