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

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

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

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

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

  3. uva 11992 - Fast Matrix Operations

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

  4. uva 11992 Fast Matrix Operations

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

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

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

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

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

  7. 数学基础 - 矩阵的基本运算(Matrix Operations)

    矩阵的基本运算(Matrix Operations) 目录 矩阵的基本运算(Matrix Operations) 目录 三个初等行(列)变换 加法(Plus) 乘法(Multiply) 与数的乘法 与 ...

  8. Matrix operations

    本文为<Linear algebra and its applications>的读书笔记 目录 Sums and Scalar Multiples Matrix Multiplicati ...

  9. Fast Matrix Factorization for Online Recommendation with Implicit Feedback论文代码分析

    1 数据结构 userCount:用户数 itemCount:项目数 user_ratings:ArrayList<ArrayList>, 问:此处为什么要用二维数组? 答:第1维是用户, ...

最新文章

  1. asp备份恢复mssql数据库的代码
  2. “隐私快递单”的保护理念应全面推行
  3. 关于 mysql 在联合查询时,使用 concat 拼接查询条件
  4. 一篇年薪60万的JVM性能调优文章
  5. django mysql filter_Django filter中用contains 在mysql中的问题
  6. selenium3 + java 日志
  7. 190408每日一句
  8. 线性代数辅导讲义(第五章 特征值特征向量)
  9. 《非暴力沟通》—— 马歇尔·卢森堡博士 读后摘录总结
  10. Mybatis 自学笔记【全结尾狂神说练习29道】
  11. 拯救期末!大四留学生发“论文机器人”,替你读文献给方向调格式,已被ACL2019收录
  12. 2021 中国开源码力榜启动,寻找开源世界的超级码丽
  13. asp.net1028-餐厅自助点餐系统#毕业设计
  14. 江苏省普通高校“专转本”选拔考试 计算机专业大类专业综合基础理论考试大纲
  15. Note: Bimodal Content Defined Chunking for Backup Streams
  16. CGB2105-Day-09笔记
  17. python脚本定时发送邮件
  18. shell企业面试题练习
  19. 小白学Rust(一):Rust产生随机数
  20. zoj 3353 Chess Board 高斯消元

热门文章

  1. 详解Vuex常见问题、深入理解Vuex
  2. 算法 --- 反转数组
  3. es6 --- Promise.catch
  4. JS实现css属性动画效果
  5. 批量下载小说网站上的小说(python爬虫)
  6. php异步处理,执行系统命令
  7. Java知多少(12)运算符
  8. 编译apache过程中出现如下错误及解决办法
  9. Windows部署服务WDS实例
  10. 防止多重启动之调用Api [收集2005090201]