UVA - 11992:Fast Matrix Operations
线段树,注意tag优先级
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 1000005
using namespace std;
struct Node{
int sumv,maxv,minv,tag_add,tag_change;
Node(int p1=,int p2=,int p3=,int p4=,int p5=){
sumv=p1,maxv=p3,minv=p2,tag_add=p4,tag_change=p5;
}
}dat[][MAXN<<];
int a[][MAXN];
Node Merge(Node t1,Node t2){
if(t1.tag_add==-)return t2;
if(t2.tag_add==-)return t1;
Node ret;
ret.sumv=t1.sumv+t2.sumv;
ret.maxv=max(t1.maxv,t2.maxv);
ret.minv=min(t1.minv,t2.minv);
return ret;
}
void build(Node d[],int x,int k,int L,int R){
if(L+==R){
d[k].sumv=d[k].maxv=d[k].minv=a[x][L];
return;
}
build(d,x,k<<,L,(L+R)>>);
build(d,x,k<<|,(L+R)>>,R);
d[k]=Merge(d[k<<],d[k<<|]);
}
void pushdown(Node d[],int k,int L,int R){
int lc=(k<<),rc=(k<<|);
if(d[k].tag_change){
d[lc].tag_add=;
d[lc].tag_change=d[k].tag_change;
d[lc].sumv=d[k].tag_change*(((L+R)>>)-L);
d[lc].maxv=d[k].tag_change;
d[lc].minv=d[k].tag_change;
d[rc].tag_add=;
d[rc].tag_change=d[k].tag_change;
d[rc].sumv=d[k].tag_change*(R-((L+R)>>));
d[rc].maxv=d[k].tag_change;
d[rc].minv=d[k].tag_change;
d[k].tag_change=;
}
if(d[k].tag_add){
d[lc].tag_add+=d[k].tag_add;
d[lc].sumv+=d[k].tag_add*(((L+R)>>)-L);
d[lc].maxv+=d[k].tag_add;
d[lc].minv+=d[k].tag_add;
d[rc].tag_add+=d[k].tag_add;
d[rc].sumv+=d[k].tag_add*(R-((L+R)>>));
d[rc].maxv+=d[k].tag_add;
d[rc].minv+=d[k].tag_add;
d[k].tag_add=;
}
}
void add(Node d[],int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
d[k].tag_add+=x;
d[k].sumv+=x*(R-L);
d[k].maxv+=x;
d[k].minv+=x;
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
add(d,a,b,k<<,L,(L+R)>>,x);
add(d,a,b,k<<|,(L+R)>>,R,x);
d[k]=Merge(d[k<<],d[k<<|]);
}
}
void change(Node d[],int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
d[k].tag_add=;
d[k].tag_change=x;
d[k].sumv=x*(R-L);
d[k].maxv=x;
d[k].minv=x;
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
change(d,a,b,k<<,L,(L+R)>>,x);
change(d,a,b,k<<|,(L+R)>>,R,x);
d[k]=Merge(d[k<<],d[k<<|]);
}
}
Node query(Node d[],int a,int b,int k,int L,int R){
if(b<=L||R<=a){
return Node(-,-,-,-,-);
}
else if(a<=L&&R<=b){
return d[k];
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
Node lc=query(d,a,b,k<<,L,(L+R)>>);
Node rc=query(d,a,b,k<<|,(L+R)>>,R);
return Merge(lc,rc);
}
}
void debug(Node d[],int k,int L,int R){
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
if(L+==R){
printf("%d ",d[k]);
return;
}
debug(d,k<<,L,(L+R)>>);
debug(d,k<<|,(L+R)>>,R);
}
int m,n,T;
void solve(){
for(int i=;i<=m;i++){
build(dat[i],i,,,n+);
}
while(T--){
int p;scanf("%d",&p);
int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(==p){
int v;scanf("%d",&v);
for(int i=x1;i<=x2;i++){
add(dat[i],y1,y2+,,,n+,v);
}
}
else if(==p){
int v;scanf("%d",&v);
for(int i=x1;i<=x2;i++){
change(dat[i],y1,y2+,,,n+,v);
}
}
else{
Node ans=query(dat[x1],y1,y2+,,,n+);
for(int i=x1+;i<=x2;i++){
Node t=query(dat[i],y1,y2+,,,n+);
ans.sumv+=t.sumv;
ans.maxv=max(ans.maxv,t.maxv);
ans.minv=min(ans.minv,t.minv);
}
printf("%d %d %d\n",ans.sumv,ans.minv,ans.maxv);
}
}
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.in","w",stdout);
while(~scanf("%d%d%d",&m,&n,&T)){
solve();
}
}
UVA - 11992:Fast Matrix Operations的更多相关文章
- 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 线段树模板
注意 setsetset 和 addvaddvaddv 标记的下传. 我们可以控制懒惰标记的优先级. 由于 setsetset 操作的优先级高于 addaddadd 操作,当下传 setsetset ...
- Fast Matrix Operations
A Simple Problem with Integers 每次将区间向下更新,或是用之前的方法,统计当前节点到父节点处的覆盖数目. #include <cstdio> #include ...
- UVA11992 - Fast Matrix Operations(段树部分的变化)
UVA11992 - Fast Matrix Operations(线段树区间改动) 题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v ...
- UVA 11992 Fast Matrix Operations(线段树:区间修改)
题目链接 2015-10-30 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=s ...
- UVA 11992 Fast Matrix Operations (二维线段树)
解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...
- uva 11992 - Fast Matrix Operations
简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...
- UVa 11992 Fast Matrix Operations (线段树,区间修改)
题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...
随机推荐
- 多线程socket UDP收发数据
多线程socket收发数据 from threading import Thread from socket import * def sendData(): while True: sendInfo ...
- 关于mule中使用jdbc时报No Suitable Driver found错误的问题
错误大概信息: Exception in thread "main" org.mule.module.launcher.DeploymentStartException: SQLE ...
- 【技巧】Java工程中的Debug信息分级输出接口
也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...
- HDFS的7个设计特点
1.Block的放置:默认不配置.一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在与指定DataNode非同一Rack上的DataNode,最后一份放在与指定Da ...
- LeetCode & Q20-Valid Parentheses-Easy
Stack String Description: Given a string containing just the characters '(', ')', '{', '}', '[' and ...
- centos7.4下离线安装CDH5.7
(一)安装前的规划 (1)操作系统版本:centos7.4(64bit) [root@hadoop22 etc]# more /etc/centos-release CentOS Linux rele ...
- sublimeText3 中配置sass环境,并将编译后文件保存到指定文件夹
sass基于ruby引擎,所以安装时ass.compass之前需要安装ruby.具体的链接应该是(http://rubyinstaller.org/downloads).下载并安装相应的版本,勾选第二 ...
- oracle drop table(表)数据恢复方法
今天不小心把系统用户表给drop掉了,正在运行的系统正式库啊,还好可以恢复 一.查看数据库回收站,看删除的表是否还在回收站select object_name,original_name,partit ...
- python基础——类名称空间与对象(实例)名称空间
python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...
- hdu1060 Leftmost Digit---求N的N次方的首位(对数)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1060 题目描述:求N的N次方的第一位. 思路: 第一次做这种类型的题目,学到了如何运用对数. 首先推 ...