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 线段树相关推荐

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

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

  2. UVa 1400 (线段树) Ray, Pass me the dishes!

    求一个区间的最大连续子序列,基本想法就是分治,这段子序列可能在区间的左半边,也可能在区间的右半边,也有可能是横跨区间中点,这样就是左子区间的最大后缀加上右子区间的最大前缀之和. 线段树维护三个信息:区 ...

  3. uva 12086 线段树or树状数组练习

    题目链接   https://vjudge.net/problem/34215/origin 这个题就是线段树裸题,有两种操作,实现单点更新和区间和的查找即可,这里第一次学习使用树状数组完成. 二者相 ...

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

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

  5. UVA 11992 - Fast Matrix Operations(段树)

    UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...

  6. UVA 12501 Bulky process of bulk reduction ——(线段树成段更新)

    和普通的线段树不同的是,查询x~y的话,给出的答案是第一个值的一倍加上第二个值的两倍一直到第n个值的n倍. 思路的话,就是关于query和pushup的方法.用一个新的变量sum记录一下这个区间里面按 ...

  7. UVa 1471 Defense Lines - 线段树 - 离散化

    题意是说给一个序列,删掉其中一段连续的子序列(貌似可以为空),使得新的序列中最长的连续递增子序列最长. 网上似乎最多的做法是二分查找优化,然而不会,只会值域线段树和离散化... 先预处理出所有的点所能 ...

  8. UVA 12086 Potentiometers(线段树裸题)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  9. UVA 12663 第九届省赛 高桥与低桥 线段树

    题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次 看下数据10的五次方,10的五次方 ...

最新文章

  1. 4、MySQL冷备份所需物理文件
  2. Python Django 事务管理
  3. [2020多校A层11.22]party(概率期望/近似)
  4. 匿名包装器(function(){})()
  5. python 检测文件更新失败_依赖错误,检测更新失败,提示这个
  6. android+对象池使用,Android开发中对高并发对象池的重复利用
  7. 【Spring】Springb boot 集成 Es 7.6.0
  8. [js高手之路] es6系列教程 - 迭代器与生成器详解
  9. 熊猫concat()例子
  10. 关于app跳转vueh5页面时获取url附带的参数_h5唤起app技术deeplink方案总结
  11. 使用Underscore.js的template将Backbone.js的js代码和html代码分离
  12. Validator校验器中重新定义默认的错误信息模板
  13. LabWindows/CVI(一):各文件类型的含义及初始项目的搭建
  14. 怎么在服务器上接无线路由器,交换机怎么用 交换机接无线路由器设置教程【详解】...
  15. 从Jdk8到Jdk12的Java虚拟机垃圾回收(垃圾收集)相关论文和官方网站集锦
  16. 洛谷 - P3374 树状数组1
  17. 账龄分析表excel模板_电商数据分析统计模板工作表
  18. 3G门户4年衰落:转型平台遇阻 上市梦无期
  19. qq三国挂机云服务器,云服务器挂机QQ三国游戏的流程和实际操作概况记录
  20. 基于Python的旅游数据可视化系统flask

热门文章

  1. minio安装及特性原理介绍
  2. 解决thymeleaf报错 $ is not defined
  3. Django 3.2.5博客开发教程:体验django模板
  4. 解决 Ubuntu 18.04 无法关机的问题
  5. javap分析字符串拼接执行流程
  6. Scala 2.13.1 整合 Spring Boot 2.2.1开发web应用完整pom文件
  7. 【面试题视频讲解】求一个数的所有质因子
  8. VMWare NAT模式和桥接模式的区别
  9. RocketMQ部署安装(非Docker安装)
  10. 使用Java客户端操作elasticsearch--设置mappings、添加文档、查询数据