UVA - 11992 线段树
UVA - 11992
题意:有一个 r*c 的全 0矩阵, 进行 3 种操作。
1 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素加val;
2 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素变为val;
3 x1 y1 x2 y2 val 表示输出(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素的和,最小值和最大值。
共有m次操作(1<=m<=20000) 。 矩阵不超过20 行,元素总数不超过 1e6 。
tags:因为不超过 20行,所以我们每行建棵线段树,然后就是基本的区间更新查询。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second #define mid (l+(r-l)/2) #define PIII pair<ll, pair< ll, ll > > typedef long long ll; const int N = 1000005;struct Item {ll sum, minn, maxn, addv, setv; } ; vector< Item > tr[21]; int n, m, q; void Init() {rep(i,1,n) tr[i].clear();rep(i,1,n) rep(j,1,m<<2)tr[i].PB(Item()); } void pushdown(int ii, int ro, int l, int r) {if(tr[ii][ro].setv) {tr[ii][ro<<1].addv = tr[ii][ro<<1|1].addv = 0;tr[ii][ro<<1].setv = tr[ii][ro<<1|1].setv = tr[ii][ro].setv;tr[ii][ro<<1].sum = tr[ii][ro].setv*(mid-l+1);tr[ii][ro<<1|1].sum = tr[ii][ro].setv*(r-mid);tr[ii][ro<<1].maxn = tr[ii][ro<<1].minn = tr[ii][ro].setv;tr[ii][ro<<1|1].maxn = tr[ii][ro<<1|1].minn = tr[ii][ro].setv;}tr[ii][ro<<1].addv += tr[ii][ro].addv;tr[ii][ro<<1|1].addv += tr[ii][ro].addv;tr[ii][ro<<1].sum += tr[ii][ro].addv*(mid-l+1);tr[ii][ro<<1|1].sum += tr[ii][ro].addv*(r-mid);tr[ii][ro<<1].maxn += tr[ii][ro].addv;tr[ii][ro<<1].minn += tr[ii][ro].addv;tr[ii][ro<<1|1].maxn += tr[ii][ro].addv;tr[ii][ro<<1|1].minn += tr[ii][ro].addv;tr[ii][ro].addv = tr[ii][ro].setv = 0; } void pushup(int ii, int ro) {tr[ii][ro].maxn = max(tr[ii][ro<<1].maxn, tr[ii][ro<<1|1].maxn);tr[ii][ro].minn = min(tr[ii][ro<<1].minn, tr[ii][ro<<1|1].minn);tr[ii][ro].sum = tr[ii][ro<<1].sum + tr[ii][ro<<1|1].sum; } void update(int ii, int ro, int l, int r, int ql, int qr, int flag, int vi) {if(ql<=l && r<=qr) {if(flag==1) {tr[ii][ro].addv += vi;tr[ii][ro].sum += 1LL*vi*(r-l+1);tr[ii][ro].maxn += vi;tr[ii][ro].minn += vi;} else {tr[ii][ro].setv = vi;tr[ii][ro].addv = 0;tr[ii][ro].sum = 1LL*vi*(r-l+1);tr[ii][ro].maxn = tr[ii][ro].minn = vi;}return ;}pushdown(ii, ro, l, r);if(mid<qr) update(ii, ro<<1|1, mid+1, r, ql, qr, flag, vi);if(ql<=mid) update(ii, ro<<1, l, mid, ql, qr, flag, vi);pushup(ii, ro); } PIII get_ans(PIII x, PIII y) {PIII ret;ret.fi = x.fi+y.fi;ret.se.fi = max(x.se.fi, y.se.fi);ret.se.se = min(x.se.se, y.se.se);return ret; } PIII query(int ii, int ro, int l, int r, int ql, int qr) {if(ql<=l && r<=qr) {return MP(tr[ii][ro].sum, MP(tr[ii][ro].maxn, tr[ii][ro].minn));}pushdown(ii, ro, l, r);PIII ret = MP(0, MP(0,1e18));if(mid<qr) ret = get_ans(ret, query(ii, ro<<1|1, mid+1, r, ql, qr));if(ql<=mid) ret = get_ans(ret, query(ii, ro<<1, l, mid, ql, qr));pushup(ii, ro);return ret; } int main() {while(~scanf("%d%d%d", &n, &m, &q)){Init();int ti, x1, y1, x2, y2, vi;while(q--){scanf("%d", &ti);if(ti==1) {scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &vi);rep(i,x1,x2) update(i, 1, 1, m, y1, y2, 1, vi);}else if(ti==2) {scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &vi);rep(i,x1,x2) update(i, 1, 1, m, y1, y2, 2, vi);}else {scanf("%d%d%d%d", &x1, &y1, &x2, &y2);PIII ans = MP(0, MP(0,1e18));rep(i,x1,x2) ans = get_ans(ans, query(i, 1, 1, m, y1, y2));printf("%lld %lld %lld\n", ans.fi, ans.se.se, ans.se.fi);}}}return 0; }
转载于:https://www.cnblogs.com/sbfhy/p/8453900.html
UVA - 11992 线段树相关推荐
- UVa 11992 (线段树 区间修改) Fast Matrix Operations
比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...
- UVa 1400 (线段树) Ray, Pass me the dishes!
求一个区间的最大连续子序列,基本想法就是分治,这段子序列可能在区间的左半边,也可能在区间的右半边,也有可能是横跨区间中点,这样就是左子区间的最大后缀加上右子区间的最大前缀之和. 线段树维护三个信息:区 ...
- uva 12086 线段树or树状数组练习
题目链接 https://vjudge.net/problem/34215/origin 这个题就是线段树裸题,有两种操作,实现单点更新和区间和的查找即可,这里第一次学习使用树状数组完成. 二者相 ...
- 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations
题目传送门 题意:训练指南P207 分析:因为矩阵不超过20行,所以可以建20条线段的线段树,支持两个区间更新以及区间查询. #include <bits/stdc++.h> using ...
- UVA 11992 - Fast Matrix Operations(段树)
UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...
- UVA 12501 Bulky process of bulk reduction ——(线段树成段更新)
和普通的线段树不同的是,查询x~y的话,给出的答案是第一个值的一倍加上第二个值的两倍一直到第n个值的n倍. 思路的话,就是关于query和pushup的方法.用一个新的变量sum记录一下这个区间里面按 ...
- UVa 1471 Defense Lines - 线段树 - 离散化
题意是说给一个序列,删掉其中一段连续的子序列(貌似可以为空),使得新的序列中最长的连续递增子序列最长. 网上似乎最多的做法是二分查找优化,然而不会,只会值域线段树和离散化... 先预处理出所有的点所能 ...
- UVA 12086 Potentiometers(线段树裸题)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 12663 第九届省赛 高桥与低桥 线段树
题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次 看下数据10的五次方,10的五次方 ...
最新文章
- 4、MySQL冷备份所需物理文件
- Python Django 事务管理
- [2020多校A层11.22]party(概率期望/近似)
- 匿名包装器(function(){})()
- python 检测文件更新失败_依赖错误,检测更新失败,提示这个
- android+对象池使用,Android开发中对高并发对象池的重复利用
- 【Spring】Springb boot 集成 Es 7.6.0
- [js高手之路] es6系列教程 - 迭代器与生成器详解
- 熊猫concat()例子
- 关于app跳转vueh5页面时获取url附带的参数_h5唤起app技术deeplink方案总结
- 使用Underscore.js的template将Backbone.js的js代码和html代码分离
- Validator校验器中重新定义默认的错误信息模板
- LabWindows/CVI(一):各文件类型的含义及初始项目的搭建
- 怎么在服务器上接无线路由器,交换机怎么用 交换机接无线路由器设置教程【详解】...
- 从Jdk8到Jdk12的Java虚拟机垃圾回收(垃圾收集)相关论文和官方网站集锦
- 洛谷 - P3374 树状数组1
- 账龄分析表excel模板_电商数据分析统计模板工作表
- 3G门户4年衰落:转型平台遇阻 上市梦无期
- qq三国挂机云服务器,云服务器挂机QQ三国游戏的流程和实际操作概况记录
- 基于Python的旅游数据可视化系统flask
热门文章
- minio安装及特性原理介绍
- 解决thymeleaf报错 $ is not defined
- Django 3.2.5博客开发教程:体验django模板
- 解决 Ubuntu 18.04 无法关机的问题
- javap分析字符串拼接执行流程
- Scala 2.13.1 整合 Spring Boot 2.2.1开发web应用完整pom文件
- 【面试题视频讲解】求一个数的所有质因子
- VMWare NAT模式和桥接模式的区别
- RocketMQ部署安装(非Docker安装)
- 使用Java客户端操作elasticsearch--设置mappings、添加文档、查询数据