解法:因为至多20行,所以至多建20棵线段树,每行建一个。具体实现如下,有些复杂,慢慢看吧。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 1000010 struct node
{
int mini,maxi,sum;
int addmark,setmark;
}tree[][*N]; int i; void pushup(int i,int rt)
{
tree[i][rt].sum = tree[i][*rt].sum + tree[i][*rt+].sum;
tree[i][rt].mini = min(tree[i][*rt].mini,tree[i][*rt+].mini);
tree[i][rt].maxi = max(tree[i][*rt].maxi,tree[i][*rt+].maxi);
} void build(int i,int l,int r,int rt)
{
tree[i][rt].sum = tree[i][rt].mini = tree[i][rt].maxi = ;
tree[i][rt].setmark = -;
tree[i][rt].addmark = ;
if(l == r)
return;
int mid = (l+r)/;
build(i,l,mid,*rt);
build(i,mid+,r,*rt+);
pushup(i,rt);
} void pushdown(int i,int l,int r,int rt)
{
if(tree[i][rt].setmark == - && tree[i][rt].addmark == )
return;
int mid = (l+r)/;
if(tree[i][rt].setmark >= )
{
tree[i][*rt].sum = tree[i][rt].setmark*(mid-l+);
tree[i][*rt+].sum = tree[i][rt].setmark*(r-mid);
tree[i][*rt].mini = tree[i][*rt+].mini = tree[i][rt].setmark; //
tree[i][*rt].maxi = tree[i][*rt+].maxi = tree[i][rt].setmark; //
tree[i][*rt].addmark = tree[i][*rt+].addmark = ; //
tree[i][*rt].setmark = tree[i][*rt+].setmark = tree[i][rt].setmark;
tree[i][rt].setmark = -;
}
if(tree[i][rt].addmark > )
{
tree[i][*rt].sum += tree[i][rt].addmark*(mid-l+);
tree[i][*rt+].sum += tree[i][rt].addmark*(r-mid);
tree[i][*rt].maxi += tree[i][rt].addmark; //
tree[i][*rt].mini += tree[i][rt].addmark;
tree[i][*rt+].maxi += tree[i][rt].addmark;
tree[i][*rt+].mini += tree[i][rt].addmark; //
tree[i][*rt].addmark += tree[i][rt].addmark;
tree[i][*rt+].addmark += tree[i][rt].addmark;
tree[i][rt].addmark = ;
}
} void add(int l,int r,int aa,int bb,int val,int rt)
{
if(aa>r||bb<l)
return;
if(aa<=l&&bb>=r)
{
tree[i][rt].addmark += val;
//tree[i][rt].setmark = -1;
tree[i][rt].sum += (r-l+)*val;
tree[i][rt].maxi += val;
tree[i][rt].mini += val;
return;
}
pushdown(i,l,r,rt);
int mid = (l+r)/;
if(aa<=mid)
add(l,mid,aa,bb,val,*rt);
if(bb>mid)
add(mid+,r,aa,bb,val,*rt+);
pushup(i,rt);
} void setval(int l,int r,int aa,int bb,int val,int rt)
{
if(aa>r||bb<l)
return;
if(aa<=l&&bb>=r)
{
tree[i][rt].setmark = val;
tree[i][rt].addmark = ;
tree[i][rt].sum = val*(r-l+);
tree[i][rt].maxi = tree[i][rt].mini = val;
return;
}
pushdown(i,l,r,rt);
int mid = (l+r)/;
if(aa<=mid)
setval(l,mid,aa,bb,val,*rt);
if(bb>mid)
setval(mid+,r,aa,bb,val,*rt+);
pushup(i,rt);
} struct node_ans
{
int sum;
int mini,maxi;
}; node_ans query(int l,int r,int aa,int bb,int rt)
{
node_ans res,ka1,ka2;
if(aa<=l && bb>=r)
{
res.sum = tree[i][rt].sum;
res.maxi = tree[i][rt].maxi;
res.mini = tree[i][rt].mini;
return res;
}
pushdown(i,l,r,rt);
int mid = (l+r)/;
if(bb<=mid)
return query(l,mid,aa,bb,*rt);
else if(aa>mid)
return query(mid+,r,aa,bb,*rt+);
else
{
ka1 = query(l,mid,aa,bb,*rt);
ka2 = query(mid+,r,aa,bb,*rt+);
res.sum = ka1.sum + ka2.sum;
res.maxi = max(ka1.maxi,ka2.maxi);
res.mini = min(ka1.mini,ka2.mini);
return res;
}
} int main()
{
int r,c,m;
int k,zuo;
int x1,y1,x2,y2,val;
int sum,mmax,mmin;
while(scanf("%d%d%d",&r,&c,&m)!=EOF)
{
for(i=;i<=r;i++)
{
build(i,,c,);
}
for(k=;k<m;k++)
{
scanf("%d",&zuo);
if(zuo == )
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&val);
for(i=x1;i<=x2;i++)
{
add(,c,y1,y2,val,);
}
}
else if(zuo == )
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&val);
for(i=x1;i<=x2;i++)
{
setval(,c,y1,y2,val,);
}
}
else
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
node_ans la;
sum = ;
mmax = -Mod;
mmin = Mod;
for(i=x1;i<=x2;i++)
{
la = query(,c,y1,y2,);
sum += la.sum;
mmax = max(mmax,la.maxi);
mmin = min(mmin,la.mini);
}
printf("%d %d %d\n",sum,mmin,mmax);
}
}
}
}

UVA 11992 Fast Matrix Operations (二维线段树)的更多相关文章

  1. UVA 11992 - Fast Matrix Operations(段树)

    UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...

  2. poj 2155:Matrix(二维线段树,矩阵取反,好题)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17880   Accepted: 6709 Descripti ...

  3. POJ 2155 Matrix (二维线段树)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17226   Accepted: 6461 Descripti ...

  4. ZOJ 1859 Matrix Searching(二维线段树)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1859 Matrix Searching Time Limit: 10 Seco ...

  5. POJ2155 Matrix 【二维线段树】

    题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...

  6. POJ 2155 Matrix【二维线段树】

    题目大意:给你一个全是0的N*N矩阵,每次有两种操作:1将矩阵中一个子矩阵置反,2.查询某个点是0还是1 思路:裸的二维线段树 #include<iostream>#include< ...

  7. uva 11992 Fast Matrix Operations 线段树模板

    注意 setsetset 和 addvaddvaddv 标记的下传. 我们可以控制懒惰标记的优先级. 由于 setsetset 操作的优先级高于 addaddadd 操作,当下传 setsetset ...

  8. 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations

    题目传送门 题意:训练指南P207 分析:因为矩阵不超过20行,所以可以建20条线段的线段树,支持两个区间更新以及区间查询. #include <bits/stdc++.h> using ...

  9. UVA 11992 Fast Matrix Operations(线段树:区间修改)

    题目链接 2015-10-30 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=s ...

随机推荐

  1. SQL Server Insert时开启显式事务

    如果没法避免一条一条的写入,那么在处理前显示开启一个事务 begin tran  在处理完成后 commit 这样也要比不开显示事务会快很多! while i < 10000begin inse ...

  2. SharePoint 2013 新功能探索 之 标注控件

    SharePoint 2013 引入了新的UI,同时也跟进了网络潮流,把应用最广泛的标注控件也引入到了SharePoint,先看两个应用    以上是两个开发当中经常会用到,下面就介绍一下如何开发相同 ...

  3. javascript函数中的三个技巧【二】

    技巧二: [惰性载入函数] 因为浏览器之间的行为的差异,我们经常会在函数中包含了大量的if语句,以检查浏览器特性,解决不同浏览器的兼容问题,比如,我们最常见的为dom节点添加时间的函数 functio ...

  4. [经验][JS]如何观察网站,进而模仿

    应该存在着一类人: 1.看到美丽的网站时,就会F12,看看他是怎么实现的 2.看到网站数据是自己需要的时候,就会F12,看看他是怎么拿到数据的 3.看到网站一个有趣的模块时,,就会F12,看看他是怎么 ...

  5. linq 动态组合条件

    http://www.albahari.com/nutshell/predicatebuilder.aspx Dynamically Composing Expression Predicates S ...

  6. 2015年第2本(英文第1本):《The Practice of Programming》

    2015年计划透析10本英文原著,最开始选定的第一本英文书是<Who Moved my Cheese>,可是这本书实在是太短.太简单了,总体的意思就是要顺应变化,要跳出自己的舒适区,全文不 ...

  7. Android项目实战(十一):moveTaskToBack(boolean ) 方法的使用

    当你开发的程序被按后退键退出的时候, 你肯定不想让他就这么被finish()吧,那么就想把程序退置到后台就可. (类似于PC端,你关闭一个浏览器和你最小化一个浏览器的区别) 参看方法:public b ...

  8. 【读书笔记】iOS-Xcode知识-多线程

    一,Xcode使用的调试器是GDB.GDB是GNU项目的一部分,它可以在很多不同的平台上使用.如果你愿意,可以通过命令行来运行它.GDB有着完善的文档系统,尽管它的文档有些难于理解并且网络上流传着好几 ...

  9. 【原】训练自己haar-like特征分类器并识别物体(2)

    在上一篇文章中,我介绍了<训练自己的haar-like特征分类器并识别物体>的前两个步骤: 1.准备训练样本图片,包括正例及反例样本 2.生成样本描述文件 3.训练样本 4.目标识别 == ...

  10. iOS开发笔记2:单例模式(singleton)

    每一个app有且仅有一个UIApplication,类似UIApplication“ [UIApplication sharedApplication]”这种一个类有且仅有唯一实例的设计即单例模式. ...