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

元素最多有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. The web.config file for this project is missing the required DirectRequestModule.

    The web.config file for this project is missing the required DirectRequestModule.   将应用程序集的模式由集成改为经典 ...

  2. Linux 基础命令(一)

    Linux 基础: https://www.cnblogs.com/linhaifeng/articles/6045600.html Linux 比 Windows 更稳定做服务器,开发出来的软件需要 ...

  3. 《剑指offer》面试题22—栈的压入、弹出序列

    <程序员面试宝典>上也有经典的火车进站问题,类似. 如果12345是压栈顺序,序列45321可能是出栈顺序,但序列43512不可能. 规律:对序列中任意元素n,排在n后且比n小的元素一定是 ...

  4. JAVA企业级开发-jdbc事务,数据库连接池(10)

    一.   JDBC事务 事务: 问题1.什么是事务 问题2.java中(jdbc)如何控制事务 1. 事务—重点 指的的逻辑上的一组(一组sql,insert update ,delete)操作,组成 ...

  5. 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇

    ==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...

  6. win10彻底关闭自动更新

    第1步 https://jingyan.baidu.com/article/9faa7231e7b78b473c28cbb6.html 第2步 http://www.360doc.com/conten ...

  7. Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)

    题意 在一个有向无环图上,两个人分别从一个点出发,两人轮流从当前点沿着某条边移动,要求经过的边权不小于上一轮对方经过的边权(ASCII码),如果一方不能移动,则判负.两人都采取最优策略,求两人分别从每 ...

  8. solidity 学习笔记(7)内联汇编

    为什么要有内联汇编? //普通循环和内敛汇编循环比较 pragma solidity ^0.4.25; contract Assembly{ function nativeLoop() public ...

  9. JS动态append之后点击事件无效

    今天做项目用了append向HTML里面添加结构代码,代码添加之后,单击事件就没反应了.搞得我一脸懵逼,调了代码很久实在不行,我百度了一下才发现,append添加的节点单击事件是不会生效的. 原因: ...

  10. MyBatis日志实现

    maven项目resources文件夹下log4j.properties 其作用是输出controller包下参与Mybatis的类的SQL语句输出.如果包名不一样,请根据自己的项目情况调整. # G ...