uva 11992 - Fast Matrix Operations
简单的线段树的题;
有两种方法写这个题,目前用的熟是这种慢点的;
不过不知道怎么老是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相关推荐
- UVA 11992 - Fast Matrix Operations(段树)
UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...
- uva 11992 Fast Matrix Operations
这道题很狗血啊 赋值的时候那个v是大于等于0来着,主要考察区间赋值和更新,pushdown同时要有两个操作.代码如下: 1 #include<cstdio> 2 #include<c ...
- 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations
题目传送门 题意:训练指南P207 分析:因为矩阵不超过20行,所以可以建20条线段的线段树,支持两个区间更新以及区间查询. #include <bits/stdc++.h> using ...
- 【UVA】11992 - Fast Matrix Operations(段树模板)
主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...
- UVa 11992 (线段树 区间修改) Fast Matrix Operations
比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...
- Fast Matrix Operations
uva11992:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...
- UVA - 11992 线段树
UVA - 11992 题意:有一个 r*c 的全 0矩阵, 进行 3 种操作. 1 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中 ...
- 数学基础 - 矩阵的基本运算(Matrix Operations)
矩阵的基本运算(Matrix Operations) 目录 矩阵的基本运算(Matrix Operations) 目录 三个初等行(列)变换 加法(Plus) 乘法(Multiply) 与数的乘法 与 ...
- UVA - 442:Matrix Chain Multiplication
题目链接:https://vjudge.net/problem/UVA-442 题目分析 题目的意思非常简单,就是给定一个矩阵乘法的表达式然后计算就可以了.随便写写 AC代码 #include < ...
最新文章
- 我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!...
- 8279键盘扫描c语言程序,8279键盘显示C程序
- yii cgridview 默认的筛选如何做成选择框
- 医疗术语自动编码论文总结 (Automated Coding)
- python未将对象引用设置到对象的实例_未将对象引用设置到对象的实例(SystemNullReferenceException)...
- Maven Unable to locate the Javac Compiler
- Docker Caffe部署
- ML之xgboost:利用xgboost算法(sklearn+3Split+调参曲线)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
- JS删除String里某个字符的方法
- 腾讯面试编程题python_腾讯面试官出的 2 道经典数据分析面试题
- 主机文件复制到Ubuntu系统中
- 能用来写安卓吗_iPad能代替笔记本吗,除了看剧还能用来做什么?
- 2021-02-22 【转载】什么是GCJ-02火星坐标系;为什么天地图没有偏移
- VC++字符串类型转换
- Spring事务管理的四种方式(以银行转账为例)
- openlayer中的投影
- b2c常用的erp系统
- 2021爱分析·智慧城市厂商全景报告
- 全网最全最细的PLSQL下载、安装、配置、使用指南、问题解答,相关问题已汇总
- flowable设计器自定义自己的人员选择器