题意:

给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作。

1 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素add上val;

2 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素set为val;

3 x1 y1 x2 y2 val 表示输出(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素的sum,最大最小值

链接:

https://vjudge.net/contest/203644#problem/B

题解:

显然这两个操作是可以用线段树来维护的,但关键在于二维

注意到n<=20 ,所以可以考虑对每一行对列进行线段树维护

另外修改为v和增加v两个操作的同时存在

要注意:修改为v要清空增加v 并且先处理修改为v后处理增加v

代码:

#include <bits/stdc++.h>
#define mid (h+t)/2
using namespace std;
struct re{int a,b,c;} tmp;
struct ree{int h,t,x1,x2,x3,lazy1,lazy2;}p[][];
void build(int hh,int x,int h,int t)
{
p[hh][x].h=h; p[hh][x].t=t; p[hh][x].x3=;
if (h==t)
{
return;
}
build(hh,x*,h,mid); build(hh,x*+,mid+,t);
};
void down(int hh,int x)
{
if (p[hh][x].lazy2!=)
{
p[hh][x].x1=(p[hh][x].t-p[hh][x].h+)*p[hh][x].lazy2;
p[hh][x].x2=p[hh][x].lazy2;
p[hh][x].x3=p[hh][x].lazy2;
p[hh][x*].lazy2=p[hh][x].lazy2;
p[hh][x*+].lazy2=p[hh][x].lazy2;
p[hh][x*].lazy1=p[hh][x*+].lazy1=;
p[hh][x].lazy2=;
}
p[hh][x].x1+=(p[hh][x].t-p[hh][x].h+)*p[hh][x].lazy1;
p[hh][x].x2+=p[hh][x].lazy1;
p[hh][x].x3+=p[hh][x].lazy1;
p[hh][x*].lazy1+=p[hh][x].lazy1;
p[hh][x*+].lazy1+=p[hh][x].lazy1;
p[hh][x].lazy1=;
};
void change1(int hh,int x,int sum,int h,int t)
{
down(hh,x);
if (h>p[hh][x].t || p[hh][x].h>t) return;
if (h<=p[hh][x].h && p[hh][x].t<=t)
{
p[hh][x].lazy1+=sum,down(hh,x);
return;
}
change1(hh,x*,sum,h,t);
change1(hh,x*+,sum,h,t);
p[hh][x].x1=p[hh][x*].x1+p[hh][x*+].x1;
p[hh][x].x2=max(p[hh][x*].x2,p[hh][x*+].x2);
p[hh][x].x3=min(p[hh][x*].x3,p[hh][x*+].x3);
};
void change2(int hh,int x,int sum,int h,int t)
{
down(hh,x);
if (h>p[hh][x].t || p[hh][x].h>t) return;
if (h<=p[hh][x].h && p[hh][x].t<=t)
{
p[hh][x].lazy1=,p[hh][x].lazy2=sum,down(hh,x);
return;
}
change2(hh,x*,sum,h,t);
change2(hh,x*+,sum,h,t);
p[hh][x].x1=p[hh][x*].x1+p[hh][x*+].x1;
p[hh][x].x2=max(p[hh][x*].x2,p[hh][x*+].x2);
p[hh][x].x3=min(p[hh][x*].x3,p[hh][x*+].x3);
};
re query(int hh,int x,int h,int t)
{
re tmp,tmp1,tmp2;
tmp.a=; tmp.b=; tmp.c=;
down(hh,x);
if (h>p[hh][x].t || p[hh][x].h>t) return(tmp);
if (h<=p[hh][x].h && p[hh][x].t<=t)
{
tmp.a=p[hh][x].x1,tmp.b=p[hh][x].x2,tmp.c=p[hh][x].x3;
return(tmp);
}
tmp1=query(hh,x*,h,t); tmp2=query(hh,x*+,h,t);
tmp.a=tmp1.a+tmp2.a; tmp.b=max(tmp1.b,tmp2.b); tmp.c=min(tmp1.c,tmp2.c);
return(tmp);
};
int main()
{
int n,m,k,a1,a2,a3,a4,a5,a6;
while (cin>>n>>m>>k)
{
memset(p,,sizeof(p));
for (int i=; i<=n;i++)
build(i,,,m);
for (int i=;i<=k;i++)
{
cin>>a1>>a2>>a3>>a4>>a5;
if (a1==)
{
cin>>a6;
for (int j=a2;j<=a4;j++)
change1(j,,a6,a3,a5);
}
if (a1==)
{
cin>>a6;
for (int j=a2;j<=a4;j++)
change2(j,,a6,a3,a5);
}
if (a1==)
{
int sum1=,maxn=,minn=;
for (int j=a2;j<=a4;j++)
{
tmp=query(j,,a3,a5);
sum1+=tmp.a;
maxn=max(maxn,tmp.b);
minn=min(minn,tmp.c);
}
cout<<sum1<<" "<<minn<<" "<<maxn<<endl;
}
}
}
return();
}

uva 11992的更多相关文章

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

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

  2. Fast Matrix Operations(UVA)11992

    UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...

  3. UVA 11992 Fast Matrix Operations(线段树:区间修改)

    题目链接 2015-10-30 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=s ...

  4. uva 11992 为矩阵更新查询段树

    http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&page=show_problem& ...

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

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

  6. UVA 11992 Fast Matrix Operations (二维线段树)

    解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...

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

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

  8. uva 11992 - Fast Matrix Operations

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

  9. UVA 11992 线段树

    input r c m      r<=20,1<=m<=20000 m行操作 1 x1 y1 x2 y2 v       add v 2 x1 y1 x2 y2 v       s ...

  10. UVA - 11992:Fast Matrix Operations

    线段树,注意tag优先级 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cs ...

随机推荐

  1. hibernate框架学习之核心配置文件

    hibernate.cfg.xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration ...

  2. struts2框架之标签

    标签 1. <s:property> * default:默认值,例如:<s:property value="name" default="不存在&qu ...

  3. 微信小程序-动态设置背景色navigationBarBackgroundColor的值

    查看API: wx.setNavigationBarColor(OBJECT) 代码: wx.setNavigationBarColor({ frontColor: '#ffffff', // 必写项 ...

  4. jquery datetimepicker

    1.详细说明见:https://xdsoft.net/jqplugins/datetimepicker/ 语言选择中文,现在lang配置已经失效;可用: $.datetimepicker.setLoc ...

  5. Linux文件系统深度讨论【转】

      本文旨在对Linux文件系统概念高级工作方式进行的讨论,不是对特定文件系统类型(如EXT4)如何工作的低级描述,也不是对文件系统命令的教程. 每台通用计算机都需要将各种类型的数据存储在硬盘驱动器( ...

  6. 如果Android真的收费了,你怎么看?

    前言 今天突然看到一群里有人发了下面这样一张图片,然后群里又炸了!   于是又和同事讨论了android收费的问题,然后隔壁正在玩农药的UI妹子就笑了... 没错! 安卓可能要收费了!安卓可能要收费了 ...

  7. SQL Server2008从入门到精通pdf

    下载地址:网盘下载 内容介绍 编辑 <SQL Server 从入门到精通>从初学者的角度出发,通过通俗易懂的语言.丰富多彩的实例,详细地介绍了SQLServer2008开发应该掌握的各方面 ...

  8. Oracle 闪回

    Oracle 闪回特性(FLASHBACK DATABASE) 本文来源于:gerainly 的<Oracle 闪回特性(FLASHBACK DATABASE) > -========== ...

  9. ios蓝牙详解

    最近这段时间在研究蓝牙,也研究了一段时间了现在在下面做个总结 1 其实蓝牙连接只要明白了整体原理,其实挺简单的  2 大部分情况下,手机作为中心管理者,而连接的设备被称为外设,外设的结构有点像一颗大树 ...

  10. 用gojs写的流程图demo

    领导要求,可以展开收缩子级,但是子级可以有多个父级,一开始用的dagre-d3.js,但是功能不是太全,无意中看到gojs,感觉还不错,所以拿来改了改... 代码地址:https://github.c ...