简单的线段树的题;

有两种方法写这个题,目前用的熟是这种慢点的;

不过不知道怎么老是T;

感觉网上A过的人的时间度都好小,但他们都是用数组实现的

难道是指针比数组慢?

好吧,以后多用数组写写吧!

超时的代码:

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #define maxn 1000009
  5 using namespace std;
  6
  7 struct node
  8 {
  9     int l,r;
 10     int ma,mi,sum;
 11     int ad,st;
 12     bool flag1,flag2;
 13     node *left,*right;
 14 } no[maxn*3];
 15 int nonocount;
 16
 17 void build(node *rt,int l,int r)
 18 {
 19     rt->l=l;
 20     rt->r=r;
 21     rt->sum=0;
 22     rt->ma=0;
 23     rt->mi=0;
 24     if(l==r)
 25         return;
 26     int mid=(l+r)>>1;
 27     rt->left=no+nonocount++;
 28     rt->right=no+nonocount++;
 29     build(rt->left,l,mid);
 30     build(rt->right,mid+1,r);
 31 }
 32
 33 void maintain(node *rt)
 34 {
 35     rt->ma=max(rt->left->ma,rt->right->ma);
 36     rt->mi=min(rt->left->mi,rt->right->mi);
 37     rt->sum=rt->left->sum+rt->right->sum;
 38 }
 39
 40 void pushdown(node *rt)
 41 {
 42     if(rt->flag1==1)
 43     {
 44         rt->flag1=0;
 45         rt->ma+=rt->ad;
 46         rt->mi+=rt->ad;
 47         rt->sum+=(rt->r-rt->l+1)*rt->ad;
 48         if(rt->l!=rt->r)
 49         {
 50             rt->left->ad=rt->right->ad=rt->ad;
 51             rt->left->flag1=rt->right->flag1=1;
 52             pushdown(rt->left);
 53             pushdown(rt->right);
 54         }
 55         rt->ad=0;
 56         return;
 57     }
 58     if(rt->flag2==1)
 59     {
 60         rt->flag2=0;
 61         rt->sum=(rt->r-rt->l+1)*rt->ad;
 62         rt->ma=rt->mi=rt->ad;
 63         if(rt->l!=rt->r)
 64         {
 65             rt->left->ad=rt->right->ad=rt->ad;
 66             rt->left->flag2=rt->right->flag2=1;
 67             pushdown(rt->left);
 68             pushdown(rt->right);
 69         }
 70         rt->ad=0;
 71         return;
 72     }
 73 }
 74
 75 void add(node *rt,int l,int r,int v)
 76 {
 77     if(l==rt->l&&r==rt->r)
 78     {
 79         rt->ad=v;
 80         rt->flag1=1;
 81         pushdown(rt);
 82         return;
 83     }
 84     int mid=(rt->l+rt->r)>>1;
 85     if(r<=mid)add(rt->left,l,r,v);
 86     else if(l>=mid+1)add(rt->right,l,r,v);
 87     else
 88     {
 89         add(rt->left,l,mid,v);
 90         add(rt->right,mid+1,r,v);
 91     }
 92     maintain(rt);
 93 }
 94
 95 void set(node *rt,int l,int r,int v)
 96 {
 97     if(l==rt->l&&r==rt->r)
 98     {
 99         rt->ad=v;
100         rt->flag2=1;
101         pushdown(rt);
102         return;
103     }
104     int mid=(rt->l+rt->r)>>1;
105     if(r<=mid)set(rt->left,l,r,v);
106     else if(l>=mid+1)set(rt->right,l,r,v);
107     else
108     {
109         set(rt->left,l,mid,v);
110         set(rt->right,mid+1,r,v);
111     }
112     maintain(rt);
113 }
114 int ssum,mma,mmi;
115 void query(node *rt,int l,int r)
116 {
117     if(l==rt->l&&r==rt->r)
118     {
119         ssum+=rt->sum;
120         mma=max(rt->ma,mma);
121         mmi=min(rt->mi,mmi);
122         return;
123     }
124     int mid=(rt->l+rt->r)>>1;
125     if(r<=mid)query(rt->left,l,r);
126     else if(l>=mid+1)query(rt->right,l,r);
127     else
128     {
129         query(rt->left,l,mid);
130         query(rt->right,mid+1,r);
131     }
132 }
133
134 int main()
135 {
136     int n,m,q,cmd,x1,y1,x2,y2,v;
137     while(scanf("%d%d%d",&n,&m,&q)!=EOF)
138     {
139         nonocount=22;
140         for(int i=1; i<=n; i++)
141             build(no+i,1,m);
142         while(q--)
143         {
144             scanf("%d",&cmd);
145             if(cmd==1)
146             {
147                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
148                 scanf("%d",&v);
149                 for(int i=x1; i<=x2; i++)
150                     add(no+i,y1,y2,v);
151             }
152             else if(cmd==2)
153             {
154                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
155                 scanf("%d",&v);
156                 for(int i=x1; i<=x2; i++)
157                     set(no+i,y1,y2,v);
158             }
159             else
160             {
161                 int ans=0;
162                 mma=-999999,mmi=6666666;
163                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
164                 for(int i=x1; i<=x2; i++)
165                 {
166                     ssum=0;
167                     query(no+i,y1,y2);
168                     ans+=ssum;
169                 }
170                 printf("%d %d %d\n",ans,mmi,mma);
171             }
172         }
173     }
174     return 0;
175 }

View Code

转载于:https://www.cnblogs.com/yours1103/p/3403963.html

uva 11992 - 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

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

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

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

  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. 数学基础 - 矩阵的基本运算(Matrix Operations)

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

  9. UVA - 442:Matrix Chain Multiplication

    题目链接:https://vjudge.net/problem/UVA-442 题目分析 题目的意思非常简单,就是给定一个矩阵乘法的表达式然后计算就可以了.随便写写 AC代码 #include < ...

最新文章

  1. 我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!...
  2. 8279键盘扫描c语言程序,8279键盘显示C程序
  3. yii cgridview 默认的筛选如何做成选择框
  4. 医疗术语自动编码论文总结 (Automated Coding)
  5. python未将对象引用设置到对象的实例_未将对象引用设置到对象的实例(SystemNullReferenceException)...
  6. Maven Unable to locate the Javac Compiler
  7. Docker Caffe部署
  8. ML之xgboost:利用xgboost算法(sklearn+3Split+调参曲线)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
  9. JS删除String里某个字符的方法
  10. 腾讯面试编程题python_腾讯面试官出的 2 道经典数据分析面试题
  11. 主机文件复制到Ubuntu系统中
  12. 能用来写安卓吗_iPad能代替笔记本吗,除了看剧还能用来做什么?
  13. 2021-02-22 【转载】什么是GCJ-02火星坐标系;为什么天地图没有偏移
  14. VC++字符串类型转换
  15. Spring事务管理的四种方式(以银行转账为例)
  16. openlayer中的投影
  17. b2c常用的erp系统
  18. 2021爱分析·智慧城市厂商全景报告
  19. 全网最全最细的PLSQL下载、安装、配置、使用指南、问题解答,相关问题已汇总
  20. flowable设计器自定义自己的人员选择器

热门文章

  1. WebGL 利用FBO完成立方体贴图。
  2. 关于有源晶振倍频干扰的问题
  3. 11.3 free:查看系统内存信息
  4. java中的循环 while
  5. 【Q】之防火墙的SNAT DANT原理应用
  6. bcb异常处理显示错误行号_SpringBoot系列(七)- springboot 错误异常处理统一办法
  7. 终端架构深研,CodeDay 成都站等你
  8. 【OpenKruise v0.9.0】新增 Pod 重启、删除防护等重磅功能
  9. 阿里资深技术专家崮德:如何成就更好的自己
  10. 阿里云CDN产品经理陈章炜:边缘创新技术和落地实践