UVA - 11992:Fast Matrix Operations
线段树,注意tag优先级
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 1000005
using namespace std;
struct Node{
int sumv,maxv,minv,tag_add,tag_change;
Node(int p1=,int p2=,int p3=,int p4=,int p5=){
sumv=p1,maxv=p3,minv=p2,tag_add=p4,tag_change=p5;
}
}dat[][MAXN<<];
int a[][MAXN];
Node Merge(Node t1,Node t2){
if(t1.tag_add==-)return t2;
if(t2.tag_add==-)return t1;
Node ret;
ret.sumv=t1.sumv+t2.sumv;
ret.maxv=max(t1.maxv,t2.maxv);
ret.minv=min(t1.minv,t2.minv);
return ret;
}
void build(Node d[],int x,int k,int L,int R){
if(L+==R){
d[k].sumv=d[k].maxv=d[k].minv=a[x][L];
return;
}
build(d,x,k<<,L,(L+R)>>);
build(d,x,k<<|,(L+R)>>,R);
d[k]=Merge(d[k<<],d[k<<|]);
}
void pushdown(Node d[],int k,int L,int R){
int lc=(k<<),rc=(k<<|);
if(d[k].tag_change){
d[lc].tag_add=;
d[lc].tag_change=d[k].tag_change;
d[lc].sumv=d[k].tag_change*(((L+R)>>)-L);
d[lc].maxv=d[k].tag_change;
d[lc].minv=d[k].tag_change;
d[rc].tag_add=;
d[rc].tag_change=d[k].tag_change;
d[rc].sumv=d[k].tag_change*(R-((L+R)>>));
d[rc].maxv=d[k].tag_change;
d[rc].minv=d[k].tag_change;
d[k].tag_change=;
}
if(d[k].tag_add){
d[lc].tag_add+=d[k].tag_add;
d[lc].sumv+=d[k].tag_add*(((L+R)>>)-L);
d[lc].maxv+=d[k].tag_add;
d[lc].minv+=d[k].tag_add;
d[rc].tag_add+=d[k].tag_add;
d[rc].sumv+=d[k].tag_add*(R-((L+R)>>));
d[rc].maxv+=d[k].tag_add;
d[rc].minv+=d[k].tag_add;
d[k].tag_add=;
}
}
void add(Node d[],int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
d[k].tag_add+=x;
d[k].sumv+=x*(R-L);
d[k].maxv+=x;
d[k].minv+=x;
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
add(d,a,b,k<<,L,(L+R)>>,x);
add(d,a,b,k<<|,(L+R)>>,R,x);
d[k]=Merge(d[k<<],d[k<<|]);
}
}
void change(Node d[],int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
d[k].tag_add=;
d[k].tag_change=x;
d[k].sumv=x*(R-L);
d[k].maxv=x;
d[k].minv=x;
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
change(d,a,b,k<<,L,(L+R)>>,x);
change(d,a,b,k<<|,(L+R)>>,R,x);
d[k]=Merge(d[k<<],d[k<<|]);
}
}
Node query(Node d[],int a,int b,int k,int L,int R){
if(b<=L||R<=a){
return Node(-,-,-,-,-);
}
else if(a<=L&&R<=b){
return d[k];
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
Node lc=query(d,a,b,k<<,L,(L+R)>>);
Node rc=query(d,a,b,k<<|,(L+R)>>,R);
return Merge(lc,rc);
}
}
void debug(Node d[],int k,int L,int R){
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
if(L+==R){
printf("%d ",d[k]);
return;
}
debug(d,k<<,L,(L+R)>>);
debug(d,k<<|,(L+R)>>,R);
}
int m,n,T;
void solve(){
for(int i=;i<=m;i++){
build(dat[i],i,,,n+);
}
while(T--){
int p;scanf("%d",&p);
int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(==p){
int v;scanf("%d",&v);
for(int i=x1;i<=x2;i++){
add(dat[i],y1,y2+,,,n+,v);
}
}
else if(==p){
int v;scanf("%d",&v);
for(int i=x1;i<=x2;i++){
change(dat[i],y1,y2+,,,n+,v);
}
}
else{
Node ans=query(dat[x1],y1,y2+,,,n+);
for(int i=x1+;i<=x2;i++){
Node t=query(dat[i],y1,y2+,,,n+);
ans.sumv+=t.sumv;
ans.maxv=max(ans.maxv,t.maxv);
ans.minv=min(ans.minv,t.minv);
}
printf("%d %d %d\n",ans.sumv,ans.minv,ans.maxv);
}
}
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.in","w",stdout);
while(~scanf("%d%d%d",&m,&n,&T)){
solve();
}
}
UVA - 11992:Fast Matrix Operations的更多相关文章
- UVA 11992 - Fast Matrix Operations(段树)
UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...
- Fast Matrix Operations(UVA)11992
UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...
- uva 11992 Fast Matrix Operations 线段树模板
注意 setsetset 和 addvaddvaddv 标记的下传. 我们可以控制懒惰标记的优先级. 由于 setsetset 操作的优先级高于 addaddadd 操作,当下传 setsetset ...
- Fast Matrix Operations
A Simple Problem with Integers 每次将区间向下更新,或是用之前的方法,统计当前节点到父节点处的覆盖数目. #include <cstdio> #include ...
- UVA11992 - Fast Matrix Operations(段树部分的变化)
UVA11992 - Fast Matrix Operations(线段树区间改动) 题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v ...
- UVA 11992 Fast Matrix Operations(线段树:区间修改)
题目链接 2015-10-30 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=s ...
- UVA 11992 Fast Matrix Operations (二维线段树)
解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...
- uva 11992 - Fast Matrix Operations
简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...
- UVa 11992 Fast Matrix Operations (线段树,区间修改)
题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...
随机推荐
- c语言——第0次作业
1.你认为大学的学习生活.同学关系.师生应该是怎样?请一个个展开描写 大学生活:大学生活充满着挑战,首先当然必须先掌握自己所学的专业知识,然后就要学会独立,可以处理好人际关系,并且要有更强的自我约束能 ...
- jsp文件调用本地文件的方法(Tomcat server.xml 设置虚拟目录)
JSP文件: <video id="my-video" class="video-js" controls preload="auto" ...
- JAVA_SE基础——47.接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另一种方法来定义,即接口~ 在定义接口时,需要用interface关键字来声明,具体实例如code1 接口的定义格式:interface 接口名{ ...
- Mybatis学习日志
在Mybatis深入学习的一周中,总感觉跟着师傅的视屏讲解什么都能懂,但实际自己操作的时候才发现自己一脸懵逼,不知道从何入手.但还好自己做了点笔记.在此记录一下自己浅度学习Mybatis遇到几个小问题 ...
- Python struct模块
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...
- 微信开发之SVN提交代码与FTP同步到apache的根目录
SVN是协同开发的,版本控制器,就是几个人同时开发,可以提交代码到SVN服务器,这样就可以协同开发,一般是早上上班首先更新下代码,然后自己修改代码 工作一天之后,修改代码之后,下班之前,更新代码,然后 ...
- Python——cmd调用(os.system阻塞处理)
os.system(返回值为0,1,2) 0:成功 1:失败 2:错误 os.system默认阻塞当前程序执行,在cmd命令前加入start可不阻塞当前程序执行. 例如: import os os.s ...
- Centos7安装openvpn及客户端配置
1.openvpn介绍 VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,使用OpenSSL加密库中的SSLv3/TLSv1协议函数库. 目前OpenVPN能在Sola ...
- python __str__ 和__repr__方法
看下面的例子就明白了 class Test(object): def __init__(self, value='hello, world!'): self.data = value >> ...
- spring9——AOP之AspectJ对AOP的实现
从上述的实验中可以看出BeanNameAutoProxyCreator对于AOP的实现已经和完美了,但是还有两点不足之处: 1,对于切面的实现比较麻烦,既不同类型的通知切面要实现不同的接口,而且一个切 ...