Fast Matrix Operations
uva11992:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3143
题意:给你n*m的矩阵初始化的时候矩阵里面的元素全部是0,对于这个矩阵有3中操作。
1 x1 y1 x2 y2 v 把(x1 y1 x2 y2)子矩阵 里面的元素全部加上v
2 x1 y1 x2 y2 v 把(x1 y1 x2 y2)子矩阵 里面的元素全部置成v
3 x1 y1 x2 y2 求(x1 y1 x2 y2)子矩阵的和,以及最小值和最大值
题解:很明显是二维线段树维护,并且题目中的n不超过20.打20棵线段树就可以解决。这里的置成v,可以看成是*0+v,加上v可以看成*1+v;
线段树维护一个mul乘数,add加数,sum总和,minn最小值,maxn最大值。注意pushdown时候对子节点先*后加。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int N=100002; 7 struct SegTree{ 8 int l,r; 9 int add,mul; 10 int sum,minn,maxn; 11 void init(){ 12 add=0;mul=1; 13 } 14 inline int mid(){ 15 return (l+r)>> 1; 16 } 17 inline int len(){ 18 return r-l+1; 19 } 20 void to_mul(int m){//每次*一个数,那么之前add的数此时也要*这个数 21 sum *=m; 22 minn*=m; 23 maxn*=m; 24 mul *= m; 25 add *= m; 26 } 27 void to_add(int a){ 28 minn+=a; 29 maxn+=a; 30 sum +=a* len(); 31 add +=a; 32 } 33 }T[23][N*4]; 34 void pushdown(int num,int rt){//这里一定要注意 35 T[num][rt<<1].to_mul(T[num][rt].mul); 36 T[num][rt<<1|1].to_mul(T[num][rt].mul); 37 T[num][rt<<1].to_add(T[num][rt].add); 38 T[num][rt<<1|1].to_add(T[num][rt].add); 39 T[num][rt].init(); 40 } 41 void pushup(int num,int rt){ 42 T[num][rt].sum=T[num][rt<<1].sum+T[num][rt<<1|1].sum; 43 T[num][rt].maxn=max(T[num][rt<<1].maxn,T[num][rt<<1|1].maxn); 44 T[num][rt].minn=min(T[num][rt<<1].minn,T[num][rt<<1|1].minn); 45 } 46 void build(int num,int rt,int l,int r){ 47 T[num][rt].l=l; 48 T[num][rt].r=r; 49 T[num][rt].minn=T[num][rt].maxn=T[num][rt].sum=0; 50 T[num][rt].init(); 51 if(l==r){ 52 return; 53 } 54 int mid=T[num][rt].mid(); 55 build(num,rt<<1,l,mid); 56 build(num,rt<<1|1,mid+1,r); 57 pushup(num,rt); 58 } 59 void update(int num,int rt,int l,int r,int mul,int add){ 60 if(T[num][rt].l==l&&T[num][rt].r==r){ 61 T[num][rt].to_mul(mul); 62 T[num][rt].to_add(add); 63 return; 64 } 65 pushdown(num,rt); 66 int mid=T[num][rt].mid(); 67 if(mid>=r)update(num,rt<<1,l,r,mul,add); 68 else if(mid<l)update(num,rt<<1|1,l,r,mul,add); 69 else { 70 update(num,rt<<1,l,mid,mul,add); 71 update(num,rt<<1|1,mid+1,r,mul,add); 72 } 73 pushup(num,rt); 74 } 75 SegTree query(int num,int rt,int l,int r){ 76 if(T[num][rt].l==l&&T[num][rt].r==r) 77 return T[num][rt]; 78 pushdown(num,rt); 79 int mid=T[num][rt].mid(); 80 if(mid>=r)return query(num,rt<<1,l,r); 81 else if(mid<l)return query(num,rt<<1|1,l,r); 82 else{ 83 SegTree t1=query(num,rt<<1,l,mid); 84 SegTree t2=query(num,rt<<1|1,mid+1,r); 85 SegTree t; 86 t.maxn=max(t1.maxn,t2.maxn); 87 t.minn=min(t1.minn,t2.minn); 88 t.sum=t1.sum+t2.sum; 89 return t; 90 } 91 } 92 int n,m,r; 93 int x1,y1,x2,y2,val,type; 94 int main(){ 95 while(~scanf("%d%d%d",&r,&n,&m)){ 96 for(int i=1;i<=r;i++) 97 build(i,1,1,n); 98 for(int i=1;i<=m;i++){ 99 scanf("%d%d%d%d%d",&type,&x1,&y1,&x2,&y2); 100 if(type==1){ 101 scanf("%d",&val); 102 for(int i=x1;i<=x2;i++) 103 update(i,1,y1,y2,1,val); 104 } 105 else if(type==2){ 106 scanf("%d",&val); 107 for(int i=x1;i<=x2;i++) 108 update(i,1,y1,y2,0,val); 109 } 110 else { 111 int sum=0,minn=1000000002,maxn=0; 112 SegTree ans; 113 for(int i=x1;i<=x2;i++){ 114 ans=query(i,1,y1,y2); 115 sum+=ans.sum; 116 minn=min(minn,ans.minn); 117 maxn=max(maxn,ans.maxn); 118 } 119 printf("%d %d %d\n",sum,minn,maxn); 120 } 121 } 122 } 123 124 }
View Code
转载于:https://www.cnblogs.com/chujian123/p/3840487.html
Fast Matrix Operations相关推荐
- UVA 11992 - Fast Matrix Operations(段树)
UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...
- 【UVA】11992 - Fast Matrix Operations(段树模板)
主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...
- uva 11992 - Fast Matrix Operations
简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...
- uva 11992 Fast Matrix Operations
这道题很狗血啊 赋值的时候那个v是大于等于0来着,主要考察区间赋值和更新,pushdown同时要有两个操作.代码如下: 1 #include<cstdio> 2 #include<c ...
- UVa 11992 (线段树 区间修改) Fast Matrix Operations
比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...
- 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations
题目传送门 题意:训练指南P207 分析:因为矩阵不超过20行,所以可以建20条线段的线段树,支持两个区间更新以及区间查询. #include <bits/stdc++.h> using ...
- 数学基础 - 矩阵的基本运算(Matrix Operations)
矩阵的基本运算(Matrix Operations) 目录 矩阵的基本运算(Matrix Operations) 目录 三个初等行(列)变换 加法(Plus) 乘法(Multiply) 与数的乘法 与 ...
- Matrix operations
本文为<Linear algebra and its applications>的读书笔记 目录 Sums and Scalar Multiples Matrix Multiplicati ...
- Fast Matrix Factorization for Online Recommendation with Implicit Feedback论文代码分析
1 数据结构 userCount:用户数 itemCount:项目数 user_ratings:ArrayList<ArrayList>, 问:此处为什么要用二维数组? 答:第1维是用户, ...
最新文章
- asp备份恢复mssql数据库的代码
- “隐私快递单”的保护理念应全面推行
- 关于 mysql 在联合查询时,使用 concat 拼接查询条件
- 一篇年薪60万的JVM性能调优文章
- django mysql filter_Django filter中用contains 在mysql中的问题
- selenium3 + java 日志
- 190408每日一句
- 线性代数辅导讲义(第五章 特征值特征向量)
- 《非暴力沟通》—— 马歇尔·卢森堡博士 读后摘录总结
- Mybatis 自学笔记【全结尾狂神说练习29道】
- 拯救期末!大四留学生发“论文机器人”,替你读文献给方向调格式,已被ACL2019收录
- 2021 中国开源码力榜启动,寻找开源世界的超级码丽
- asp.net1028-餐厅自助点餐系统#毕业设计
- 江苏省普通高校“专转本”选拔考试 计算机专业大类专业综合基础理论考试大纲
- Note: Bimodal Content Defined Chunking for Backup Streams
- CGB2105-Day-09笔记
- python脚本定时发送邮件
- shell企业面试题练习
- 小白学Rust(一):Rust产生随机数
- zoj 3353 Chess Board 高斯消元