题意:

给定一个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. MATLAB GUI对话框设计

    原文地址:http://blog.csdn.net/shuziluoji1988/article/details/8532982 1.公共对话框: 公共对话框是利用windows资源的对话框,包括文件 ...

  2. hdu 4825 && acdream 1063 01字典树异或问题

    题意: 给一个集合,多次询问,每次给一个k,问你集合和k异或结果最大的哪个 题解: 经典的01字典树问题,学习一哈. 把一个数字看成32位的01串,然后查找异或的时候不断的沿着^为1的路向下走即可 # ...

  3. 微信小程序采坑(一)

    1.微信小程序如何让text内容空格 <text decode="{{true}}" space="{{true}}">  </text> ...

  4. OPENSSL编程 第二十章 椭圆曲线

    20.1  ECC介绍 椭圆曲线算法可以看作是定义在特殊集合下数的运算,满足一定的规则.椭圆曲线在如下两个域中定义:Fp域和F2m域. Fp域,素数域,p为素数: F2m域:特征为2的有限域,称之为二 ...

  5. Linux 的 OOM 终结者(Out Of Memory killer)

    现在是早晨6点钟.已经醒来的我正在总结到底是什么事情使得我的起床闹铃提前了这么多.故事刚开始的时候,手机铃声恰好停止.又困又烦躁的我看了下手机,看看是不是我自己疯了把闹钟调得这么早,居然是早晨5点.然 ...

  6. 洛谷P4841 城市规划 [生成函数,NTT]

    传送门 题意简述:求\(n​\)个点的简单无向连通图的数量\(\mod \;1004535809​\),\(n \leq 130000​\) 经典好题呀!这里介绍两种做法:多项式求逆.多项式求对数 先 ...

  7. Confluence 6 中修改默认的表现和内容

    Confluence 构建了一些有用的默认设置,这些设置能够让第一次访问使用 Confluence 系统的用户更好的了解系统.同时默认的内容将新空间和其他区域放置在 Confluence 中. Con ...

  8. js 判断输入的内容是否是整数

    需求简介:列表有一列排序,其值只能是整数,不能是小数,在js中判断,并给出提示 解决思路:在js中先获取表单的值,然后用isNaN,然后查一下怎么把小数排除在外.我靠( ‵o′)凸,这只能算是半路把! ...

  9. Imperial roads 非严格次小生成树

    cf测评姬比uva快了五倍... /* 不管这条边是不是在mst上,直接跑lca求出路径上的最大边w即可 ans=mst-w+dist(u,v) */ #include<bits/stdc++. ...

  10. 20165314 2016-2017-2 《Java程序设计》第3周学习总结

    20165314 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 类体包含成员变量和域变量 局部变量只在方法内有效 对象的创建以及对象对自己变量和方法通过用. ...