UVA 11992 - Fast Matrix Operations

题目链接

题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a。查询和

思路:因为最多20列,所以全然能够当作20个线段树来做,然后线段树是区间改动区间查询,利用延迟操作,开两个延迟值一个存放set操作。一个存放add操作

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define lson(x) ((x<<1) + 1)
#define rson(x) ((x<<1) + 2)
#define INF 0x3f3f3f3fconst int N = 1000005;int r, c, m;struct Node {int l, r;int sum, Max, Min, sumv, setv;
} node[4 * N];void pushup(int x) {node[x].sum = node[lson(x)].sum + node[rson(x)].sum;node[x].Max = max(node[lson(x)].Max, node[rson(x)].Max);node[x].Min = min(node[lson(x)].Min, node[rson(x)].Min);
}void pushdown(int x) {if (node[x].setv) {node[lson(x)].sumv = node[rson(x)].sumv = 0;node[lson(x)].setv = node[rson(x)].setv = node[x].setv;node[lson(x)].sum = (node[lson(x)].r - node[lson(x)].l + 1) * node[x].setv;node[rson(x)].sum = (node[rson(x)].r - node[rson(x)].l + 1) * node[x].setv;node[lson(x)].Max = node[lson(x)].Min = node[x].setv;node[rson(x)].Max = node[rson(x)].Min = node[x].setv;node[x].setv = 0;}if (node[x].sumv) {node[lson(x)].sumv += node[x].sumv;node[rson(x)].sumv += node[x].sumv;node[lson(x)].sum += (node[lson(x)].r - node[lson(x)].l + 1) * node[x].sumv;node[rson(x)].sum += (node[rson(x)].r - node[rson(x)].l + 1) * node[x].sumv;node[lson(x)].Max += node[x].sumv;node[lson(x)].Min += node[x].sumv;node[rson(x)].Max += node[x].sumv;node[rson(x)].Min += node[x].sumv;node[x].sumv = 0;}
}void build(int l, int r, int x) {node[x].l = l; node[x].r = r;if (l == r) {node[x].sum = node[x].Max = node[x].Min = node[x].sumv = node[x].setv = 0;return;}int mid = (l + r) / 2;build(l, mid, lson(x));build(mid + 1, r, rson(x));pushup(x);
}void add(int l, int r, int v, int x) {if (node[x].l >= l && node[x].r <= r) {node[x].sumv += v;node[x].sum += (node[x].r - node[x].l + 1) * v;node[x].Max += v;node[x].Min += v;return;}pushdown(x);int mid = (node[x].l + node[x].r) / 2;if (l <= mid) add(l, r, v, lson(x));if (r > mid) add(l, r, v, rson(x));pushup(x);
}void set(int l, int r, int v, int x) {if (node[x].l >= l && node[x].r <= r) {node[x].setv = v;node[x].sum = (node[x].r - node[x].l + 1) * v;node[x].Max = node[x].Min = v;node[x].sumv = 0;return;}pushdown(x);int mid = (node[x].l + node[x].r) / 2;if (l <= mid) set(l, r, v, lson(x));if (r > mid) set(l, r, v, rson(x));pushup(x);
}Node query(int l, int r, int x) {Node ans; ans.sum = 0; ans.Max = 0; ans.Min = INF;if (node[x].l >= l && node[x].r <= r) {ans.sum = node[x].sum;ans.Max = node[x].Max;ans.Min = node[x].Min;return ans;}pushdown(x);int mid = (node[x].l + node[x].r) / 2;if (l <= mid) {Node tmp = query(l, r, lson(x));ans.sum += tmp.sum;ans.Max = max(ans.Max, tmp.Max);ans.Min = min(ans.Min, tmp.Min);}if (r > mid) {Node tmp = query(l, r, rson(x));ans.sum += tmp.sum;ans.Max = max(ans.Max, tmp.Max);ans.Min = min(ans.Min, tmp.Min);}return ans;
}int main() {while (~scanf("%d%d%d", &r, &c, &m)) {build(1, r * c, 0);int q, x1, y1, x2, y2, v;while (m--) {scanf("%d", &q);if (q == 3) {scanf("%d%d%d%d", &x1, &y1, &x2, &y2);x1--; x2--;int sum = 0, Max = 0, Min = INF;for (int i = x1; i <= x2; i++) {Node ans = query(i * c + y1, i * c + y2, 0);sum += ans.sum;Max = max(Max, ans.Max);Min = min(Min, ans.Min);}printf("%d %d %d\n", sum, Min, Max);}else {scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &v);x1--; x2--;for (int i = x1; i <= x2; i++) {if (q == 1) add(i * c + y1, i * c + y2, v, 0);else set(i * c + y1, i * c + y2, v, 0);}}}}return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4750075.html,如需转载请自行联系原作者

UVA 11992 - Fast Matrix Operations(段树)相关推荐

  1. 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations

    题目传送门 题意:训练指南P207 分析:因为矩阵不超过20行,所以可以建20条线段的线段树,支持两个区间更新以及区间查询. #include <bits/stdc++.h> using ...

  2. uva 11992 - Fast Matrix Operations

    简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...

  3. uva 11992 Fast Matrix Operations

    这道题很狗血啊 赋值的时候那个v是大于等于0来着,主要考察区间赋值和更新,pushdown同时要有两个操作.代码如下: 1 #include<cstdio> 2 #include<c ...

  4. 【UVA】11992 - Fast Matrix Operations(段树模板)

    主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...

  5. UVa 11992 (线段树 区间修改) Fast Matrix Operations

    比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...

  6. Fast Matrix Operations

    uva11992:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...

  7. UVA - 11992 线段树

    UVA - 11992 题意:有一个 r*c 的全 0矩阵, 进行 3 种操作. 1 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中 ...

  8. C++Persistent segment tree持久段树的实现算法(附完整源码)

    C++Persistent segment tree持久段树的实现算法 C++Persistent segment tree持久段树的实现算法完整源码(定义,实现,main函数测试) C++Persi ...

  9. C语言实现段树segment tree(附完整源码)

    C语言实现段树segment tree 段树结构体定义 实现以下6个接口 完整实现和main测试源码 段树结构体定义 typedef struct segment_tree {void *root; ...

最新文章

  1. Appium的环境搭建和配置
  2. Eclipse中出现JS文件前有红叉的解决方法
  3. java.lang.IllegalStateException: Error starting child错误的产生与解决
  4. 移动端报表JS开发演示样例
  5. pyqt5程序的图标
  6. CAD图纸管理用什么软件?
  7. 代码质量(权威精选植根于开发实践的最佳读物)
  8. java怎么使用mfc,调用mfc方法
  9. 配音赚钱的软件有哪些 ?推荐以下这3个平台
  10. 极飞P20植保无人机测评
  11. 笔记本无线连外网,有线连内网,如何实现?
  12. 成人c语言培训,C语言程序设计在成人教育中教学.doc
  13. JavaScript设计模式都有哪些?
  14. STM32—sg90编程
  15. 苹果开机是白苹果黑屏_这是苹果应如何回应史诗般的1984年诱饵
  16. 时空之轮Android手柄,经典角色扮演类游戏 Android时空之轮
  17. 机器人搏击大赛冠军_喜报|2019中国智能机器人格斗大赛,石大学子在轮式自主格斗A、B组中包揽双冠!...
  18. CH340 +Micro USB转串口 不能识别 不起振问题
  19. Operators in MXNet-Dropout
  20. 机器学习之条件随机场(CRF)

热门文章

  1. 潭州课堂25班:Ph201805201 django 项目 第二十四课 文章主页 多级评论数据库设计 ,后台代码完成 (课堂笔记)...
  2. 使用 vscode将本地项目上传到github、从github克隆项目以及删除github上的某个文件夹...
  3. Canvas--圆弧和圆
  4. 1092 回文字符串(51nod)
  5. 求二进制数中1的个数(转)
  6. 码农干私活的建议(转)
  7. python 验证数据类型函数
  8. 利用SQL移动硬盘文件(转于zjcxc)
  9. 消除ie上的:为了有利于保护安全性,IE已限制此网页运行可以访问计算机的脚本或 ActiveX 控件...
  10. Linux curl命令