题意:

给定一个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. VC常用小知识

    (1) 如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现.AfxGetMainWnd() ->Sho ...

  2. nginx proxy_set_header设置、自定义header

    先来看下proxy_set_header的语法 语法: proxy_set_header field value; 默认值: proxy_set_header Host $proxy_host; pr ...

  3. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析

    原文地址:http://www.cnblogs.com/zjiaxing/p/5548265.html 在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/d ...

  4. git与eclipse集成之保存快照

    1.1. 保存快照 在个分支进行编码,然后需要紧急切换到另外一个分支进行快速修复一个问题,此时可以先将当前分支的修改进行保存快照. 在分支A进行编码,保存快照 切换到另外分支B进行修改 切换回A分支继 ...

  5. 缓存系列之一:buffer、cache与浏览器缓存

    缓存系列之一:buffer.cache与浏览器缓存 一:缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如CPU的一级.二级缓存是保 ...

  6. [转]phpstorm激活码注册码序列号

    浏览器打开 http://idea.lanyus.com/ , 点击页面中的“获得注册码”,然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串,就可以注册成功!(推荐方 ...

  7. linux-history显示历史命令执行时间

    vim  ~/.bashrc 或者 ~/.bash_profile 增加:export HISTTIMEFORMAT="%F %T  " 一次会话的话先执行 然后使用history ...

  8. Vue中的render函数随笔

    使用vue-cli创建项目后,再main.js里面有这样一段代码: new Vue({ render:h => h(App) }).$mount('#app') render函数是渲染一个视图, ...

  9. vue 轮播图插件 vue-awesome-swiper

    1.npm安装 npm install vue-awesome-swiper --save 2.vue 引入 //在main.js 中全局引入 import VueAwesomeSwiper from ...

  10. -Dmaven.multiModuleProjectDirectory system property is not set.

    1.配置 maven 环境变量 新建系统变量 -> 变量名(N): M2_HOME 变量值(V): D:\apache-maven-3.5.4(改为自己的maven目录) -> 添加 pa ...