uva 11992
题意:
给定一个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的更多相关文章
- UVA 11992 - Fast Matrix Operations(段树)
UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...
- Fast Matrix Operations(UVA)11992
UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...
- UVA 11992 Fast Matrix Operations(线段树:区间修改)
题目链接 2015-10-30 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=s ...
- uva 11992 为矩阵更新查询段树
http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations
题目传送门 题意:训练指南P207 分析:因为矩阵不超过20行,所以可以建20条线段的线段树,支持两个区间更新以及区间查询. #include <bits/stdc++.h> using ...
- UVA 11992 Fast Matrix Operations (二维线段树)
解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...
- UVa 11992 (线段树 区间修改) Fast Matrix Operations
比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...
- uva 11992 - Fast Matrix Operations
简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...
- 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 ...
- UVA - 11992:Fast Matrix Operations
线段树,注意tag优先级 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cs ...
随机推荐
- win7 vs2012/2013 编译boost 1.55
bjam install stage --toolset=msvc-11.0 --stagedir="C:\Boost\boost_vc_110" link=shared runt ...
- 海康JAVA SDK库动态路径加载
海康JAVA SDK初始化路径默认是放在classes下面,见下: HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("HCNetSDK&q ...
- python bytes/str
http://eli.thegreenplace.net/2012/01/30/the-bytesstr-dichotomy-in-python-3/
- Scientific Toolworks Understand
Scientific Toolworks Understand是一款定位于代码阅读的软件.界面用Qt开发的. 软件特性: 1.支持多语言:Ada, C, C++, C#, Java, FORTRAN, ...
- Appium新版本不再支持ByName定位了怎么办
appium版本在1.5以后就不再支持ByName的定位,本文章仅介绍在appium1.6.3/1.6.4/1.6.5版本下如何支持ByName定位,适用于安卓.在使用appium1.5之后的版本时, ...
- python字符串前面u,r,b的含义详解
u/U:表示unicode字符串 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码. 一般英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u:但是中文, ...
- 数字、ip转换python实现
# 数字 ==> ip # 数字范围[0, 255^4] >>> num2ip = lambda x: '.'.join([str(x/(256**i)%256) for i ...
- dict-test
#! -*- coding:utf-8 -*-"""键必须是唯一的,但值则不必len(dict) 计算字典元素个数,即键的总数str(dict) 输出字典,以可打印的字符 ...
- setenforce: SELinux is disabled解决办法
如果在使用setenforce命令设置selinux状态的时候出现这个提示:setenforce: SELinux is disabled 那么说明selinux已经被彻底的关闭了 如果需要重新开启s ...
- 添加按钮 table增加一行 删减按钮 table去掉一行
需求描述:做的一个AA新增功能,同时可以为这个即将新增的AA添加内容,而且AA的内容默认展示一行列表,点击添加按钮后出现下一行列表 解决思路:页面首先展示一个表头和列表的一行,作为默认展示的一行列表, ...