题意:对一个矩阵进行子矩阵操作。

元素最多有1e6个,树套树不好开(我不会),把二维坐标化成一维的,一个子矩阵操作分解成多条线段的操作。

一次操作的复杂度是RlogC,很容易找到极端的数据(OJ上实测没有),如果判断一下然后启发式建树复杂度是min(RlogC,ClogR)。

代码中结点没有保存l和r,而且询问是保存在全局变量中,这样做比较省空间。但是也有缺点,比如推区间结点数量的时候会麻烦一点。

#include<bits/stdc++.h>
using namespace std; const int maxn = 1e6+;
int R,C; #define lid (id<<1)
#define rid (id<<1|1)
struct Seg
{
int add,setv;
int Max,Min,sum;
}tr[maxn<<]; #define OP1(id,val)\
tr[id].add += val; tr[id].Max += val; tr[id].Min += val; tr[id].sum += (r-l+)*val;
#define OP2(id,val)\
tr[id].Max = tr[id].setv = tr[id].Min = val; tr[id].add = ; tr[id].sum = val*(r-l+); inline void push_down(int id,int l,int r)
{
int lc = lid, rc = rid, mid = (l+r)>>;
if(tr[id].setv>=){
int &t = tr[id].setv;
swap(r,mid);
OP2(lc,t);
swap(l,r); l++; swap(mid,r);
OP2(rc,t);
l--; swap(mid,l);
t = -;
}
if(tr[id].add>){
int &t = tr[id].add;
swap(r,mid);
OP1(lc,t);
swap(l,r); l++; swap(mid,r);
OP1(rc,t);
l--; swap(mid,l);
t = ;
}
} inline void maintain(int id)
{
int lc = lid, rc = rid;
tr[id].sum = tr[lc].sum + tr[rc].sum;
tr[id].Max = max(tr[lc].Max,tr[rc].Max);
tr[id].Min = min(tr[lc].Min,tr[rc].Min);
} int ql,qr,val;
void add1D(int l = ,int r = R*C-,int id = )
{
if(ql<=l&&r<=qr) { OP1(id,val) return; }
int mid = (l+r)>>, lc = lid, rc = rid;
push_down(id,l,r);
if(ql<=mid) add1D(l,mid,lc);
if(qr>mid) add1D(mid+,r,rc);
maintain(id);
} void set1D(int l = ,int r = R*C-,int id = )
{
if(ql<=l&&r<=qr) { OP2(id,val) return; }
int mid = (l+r)>>, lc = lid, rc = rid;
push_down(id,l,r);
if(ql<=mid) set1D(l,mid,lc);
if(qr>mid) set1D(mid+,r,rc);
maintain(id);
} int queryMax1D(int l = ,int r = R*C-,int id = )
{
if(ql<=l&&r<=qr) { return tr[id].Max; }
int mid = (l+r)>>, lc = lid, rc = rid;
push_down(id,l,r);
int ret = ;
if(ql<=mid) ret = max(ret,queryMax1D(l,mid,lc));
if(qr>mid) ret = max(ret,queryMax1D(mid+,r,rc));
return ret;
} const int INF = 0x3f3f3f3f; int queryMin1D(int l = ,int r = R*C-,int id = )
{
if(ql<=l&&r<=qr) { return tr[id].Min; }
int mid = (l+r)>>, lc = lid, rc = rid;
push_down(id,l,r);
int ret = INF;
if(ql<=mid) ret = min(ret,queryMin1D(l,mid,lc));
if(qr>mid) ret = min(ret,queryMin1D(mid+,r,rc));
return ret;
} int querySum1D(int l = ,int r = R*C-,int id = )
{
if(ql<=l&&r<=qr) { return tr[id].sum; }
int mid = (l+r)>>, lc = lid, rc = rid;
push_down(id,l,r);
int ret = ;
if(ql<=mid) ret += querySum1D(l,mid,lc);
if(qr>mid) ret += querySum1D(mid+,r,rc);
return ret;
} //[0,r)
void add2D(int x1,int y1,int x2,int y2,int v)
{
val = v;
int st = x1*C+y1, len = y2-y1;
for(int x = x1; x <= x2; x++){
ql = st; qr = st+len;
add1D();
st += C;
}
} void set2D(int x1,int y1,int x2,int y2,int v)
{
val = v;
int st = x1*C+y1, len = y2-y1;
for(int x = x1; x <= x2; x++){
ql = st; qr = st+len;
set1D();
st += C;
}
} int querySum2D(int x1,int y1,int x2,int y2)
{
int ret = ;
int st = x1*C+y1, len = y2-y1;
for(int x = x1; x <= x2; x++){
ql = st; qr = st+len;
ret += querySum1D();
st += C;
}
return ret;
} int queryMax2D(int x1,int y1,int x2,int y2)
{
int ret = ;
int st = x1*C+y1, len = y2-y1;
for(int x = x1; x <= x2; x++){
ql = st; qr = st+len;
ret = max(ret,queryMax1D());
st += C;
}
return ret;
} int queryMin2D(int x1,int y1,int x2,int y2)
{
int ret = INF;
int st = x1*C+y1, len = y2-y1;
for(int x = x1; x <= x2; x++){
ql = st; qr = st+len;
ret = min(ret,queryMin1D());
st += C;
}
return ret;
} int main()
{
//freopen("in.txt","r",stdin);
int m;
while(~scanf("%d%d%d",&R,&C,&m)){
ql = ; qr = R*C-; val = ;
set1D();
while(m--){
int op,x1,y1,x2,y2; scanf("%d%d%d%d%d",&op,&x1,&y1,&x2,&y2);
if(op == ){
int v; scanf("%d",&v);
add2D(x1-,y1-,x2-,y2-,v);
}else if(op == ){
int v; scanf("%d",&v);
set2D(x1-,y1-,x2-,y2-,v);
}else {
x1--;x2--;y1--;y2--;
printf("%d %d %d\n",querySum2D(x1,y1,x2,y2),queryMin2D(x1,y1,x2,y2),queryMax2D(x1,y1,x2,y2));
}
}
}
return ;
}

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 线段树模板

    注意 setsetset 和 addvaddvaddv 标记的下传. 我们可以控制懒惰标记的优先级. 由于 setsetset 操作的优先级高于 addaddadd 操作,当下传 setsetset ...

  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 Fast Matrix Operations

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

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

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

  6. uva 11992 - Fast Matrix Operations

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

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

    题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...

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

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

  9. Fast Matrix Operations(UVA)11992

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

随机推荐

  1. 使用go实现基于命令行的计算器程序

    项目目录结构 calcs.go源文件 package main import ( "fmt" "os" "strconv" "my ...

  2. 解码H264文件的一些基础知识

    这段时间一直在进行编写H264文件的解析类,因此对于H264文件的格式有了初步的了解,官方文档也看了个大概.这篇文章主要是总结了一些为解码H264文件而需要的一些前期知识,话不多说,下面是干货,有些是 ...

  3. 将Date转换成 yyyy-MM-dd 格式的字符串

    // 方法1 原型Date.prototype.format = function (format) {    var o = {        "M+": this.getMon ...

  4. 如何获取input框type=file选中的文件对象(FileReader)

    $("input[type='file']").change(function() { var file = this.files[0]; if (window.FileReade ...

  5. 盛大游戏技术总监徐峥:Unity引擎使用的三种方式

    在5月13日Unite 2017 案例分享专场上,盛大游戏技术总监徐峥分享了使用Unity引擎的三种方式,以下为详细内容: 大家好,我先简单介绍一下我自己,我是盛大游戏的技术总监徐峥.我今天想分享的主 ...

  6. 洛谷P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower

    P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower 题目描述 “逢低吸纳”是炒股的一条成功秘诀.如果你想成为一个成功的投资者,就要遵守这条秘诀: "逢低吸纳,越低越 ...

  7. uoj#290. 【ZJOI2017】仙人掌(数数+仙人掌+树形dp)

    传送门 这图可以说是非常形象了2333 模拟赛的时候打了个表发现为一条链的时候答案是\(2^{n-2}\)竟然顺便过了第一个点 然后之后订正的时候强联通分量打错了调了一个上午 首先不难发现我们可以去掉 ...

  8. SpringMVC 的数据绑定

    1.数据自动绑定 SpringMVC 框架支持不需要任何数据绑定的注解直接将表单参数绑定到我们的执行方法的参数上. 表单参数:包括 POST 以及 GET 发送过来的参数 就是以内容类型为:encty ...

  9. Maven对坐标的管理 自动导入传递依赖 坐标和传递依赖分级显示

  10. sublime配置nodejs运行调试js

    node.js调试javascript的配置 1. 首先到 nodejs.org 下载 Node.js 安装包并安装.2. 打开 Sublime Text 编辑器.选择菜单 Tools --> ...