解题思路:

  将矩阵每一行建立一棵线段树,进而变成一维问题求解。注意数组要开 4*N

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = + ; const int INF = ;
int q, x1_, x2_, y1, y2, v_add, v_set; struct segment_tree {
int sumv[4*maxn],minv[4*maxn],maxv[4*maxn];
int addv[4*maxn], setv[4*maxn];
void maintain(int o, int L, int R) {
int lc = *o, rc = *o + ;
sumv[o] = minv[o] = maxv[o] = ;
if(setv[o] >= ) {
sumv[o] = setv[o] * (R-L+);
minv[o] = maxv[o] = setv[o];
}
else if(R > L) {
sumv[o] = sumv[lc] + sumv[rc];
minv[o] = min(minv[lc], minv[rc]);
maxv[o] = max(maxv[lc], maxv[rc]);
}
minv[o] += addv[o]; maxv[o] += addv[o]; sumv[o] += addv[o] * (R-L+);
}
void pushdown(int o) {
int lc = *o, rc = *o+;
if(setv[o] >= ) {
setv[lc] = setv[rc] = setv[o];
addv[lc] = addv[rc] = ;
setv[o] = -;
}
if(addv[o] > ) {
addv[lc] += addv[o];
addv[rc] += addv[o];
addv[o] = ;
}
}
void update_add(int o, int L, int R) {
int lc = *o, rc = o*+;
if(y1 <= L && y2 >= R) {
addv[o] += v_add;
}
else {
pushdown(o);
int M = L + (R-L)/;
if(y1 <= M) update_add(lc, L, M); else maintain(lc, L, M);
if(y2 > M) update_add(rc, M+, R);else maintain(rc, M+, R);
}
maintain(o, L, R);
}
void update_set(int o, int L, int R) {
int lc = *o, rc = o*+;
if(y1 <= L && y2 >= R) {
setv[o] = v_set;
addv[o] = ;
}
else {
pushdown(o);
int M = L + (R-L)/;
if(y1 <= M) update_set(lc, L, M); else maintain(lc, L, M);
if(y2 > M) update_set(rc, M+, R); else maintain(rc, M+, R);
}
maintain(o, L, R);
} void query(int o, int L, int R, int add, int& _min, int& _max, int& _sum) {
if(setv[o] >= ) {
_sum += (add+setv[o]+addv[o]) * (min(R, y2)-max(L, y1)+);
_min = min(_min, setv[o]+addv[o]+add);
_max = max(_max, setv[o]+addv[o]+add);
}
else if(y1 <= L && y2 >= R) {
_sum += sumv[o] + add * (R-L+);
_min = min(_min, minv[o]+add);
_max = max(_max, maxv[o]+add);
}
else {
int M = L + (R-L)/;
if(y1 <= M) query(o*, L, M, add+addv[o], _min, _max, _sum);
if(y2 > M) query(o*+, M+, R, add+addv[o], _min, _max, _sum);
}
} void init() {
memset(setv, -, sizeof setv);
memset(addv, , sizeof addv);
memset(sumv, , sizeof sumv);
memset(minv, , sizeof minv);
memset(maxv, , sizeof maxv);
}
};
int r, c, m;
const int maxr = + ; segment_tree tree[maxr]; int main(int argc, const char * argv[]) { while(scanf("%d%d%d", &r, &c, &m) == ){ for(int i = ; i < maxr; i++) tree[i].init();
for(int i = ; i < m; i++) { scanf("%d%d%d%d%d", &q, &x1_, &y1, &x2_, &y2);
if(q == ){
scanf("%d", &v_add);
for(int x = x1_; x <= x2_; x++) {
tree[x].update_add(, , c);
}
}
if(q == ) {
scanf("%d", &v_set);
for(int x = x1_; x <= x2_; x++) {
tree[x].update_set(, , c);
}
}
if(q == ){
int gmin = INF, gmax = -INF, gsum = ;
for(int x = x1_; x <= x2_; x++) {
int _min = INF, _max = -INF, _sum = ;
tree[x].query(, , c, ,_min, _max, _sum);
gsum += _sum;
gmin = min(gmin, _min);
gmax = max(gmax, _max);
}
printf("%d %d %d\n", gsum, gmin, gmax);
}
}
}
return ;
}

UVA 11992 ——线段树(区间修改)的更多相关文章

  1. UVa 11992 (线段树 区间修改) Fast Matrix Operations

    比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...

  2. Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)

    题意: 给出一个具有N个点的树,现在给出两种操作: 1.get x,表示询问以x作为根的子树中,1的个数. 2.pow x,表示将以x作为根的子树全部翻转(0变1,1变0). 思路:dfs序加上一个线 ...

  3. 题解报告:hdu 1698 Just a Hook(线段树区间修改+lazy懒标记的运用)

    Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for m ...

  4. poj 2528 线段树区间修改+离散化

    Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...

  5. E - Just a Hook HDU - 1698 线段树区间修改区间和模版题

    题意  给出一段初始化全为1的区间  后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...

  6. HDU 4027 Can you answer these queries? (线段树区间修改查询)

    描述 A lot of battleships of evil are arranged in a line before the battle. Our commander decides to u ...

  7. poj2528 Mayor's posters(线段树区间修改+特殊离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  8. hiho_1078_线段树区间修改

    题目 给定一组数,要求进行若干次操作,这些操作可以分为两种类型: (1) CMD 1 beg end value 将数组中下标在[beg, end] 区间内数字都变为value (2) CMD 2 b ...

  9. HDU - 1698 线段树区间修改,区间查询

    这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可. 我自己做的时候太傻逼了...把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右 ...

随机推荐

  1. AnalyticDB for MySQL 3.0 技术架构解析

    企业数据需求不断变化,近年来变化趋势日益明显,从数据的3V特性看:体积,速度和变化:Big Data强调数据量,PB级以上,是静态数据.而Fast Data在数据量的基础上,意味着速度和和变化,意味着 ...

  2. JavaScript--漏写var却还能使用标签

    一个漏写var带来的问题: 这个是不标准的写法!不建议使用 但是效果还是出来了,为什么呢? 原因: https://zhidao.baidu.com/question/1637589020484843 ...

  3. poj2125 最小点权覆盖集

    题意:有一张图,对于每个点,有出边和入边,现在目的是删除改图的所有边,对于每个点,删除出边的花费Wi-,删除入边的花费Wi+,现在的目的求删去所有边后的花费最小. 建图方法:对于每个点i,拆点为i,i ...

  4. asp.net ajax客户端框架如何调用Web Service

    asp.net ajax客户端框架如何调用Web Service 1:Web Service类添加 [System.Web.Script.Services.ScriptService]特性2:需要异步 ...

  5. springboot web开发【转】【补】

    pom.xml引入webjars的官网 https://www.webjars.org/ https://www.thymeleaf.org/doc/tutorials/3.0/usingthymel ...

  6. [考试维护]之IIS发布 标签: iis 2015-06-07 22:11 627人阅读 评论(18) 收藏

    考试维护也进行了一段时间了,总结一下这段时间学习到的东西,今天写一下在服务器上如何发布IIS,一开始,我们准备了两台服务器,一台Win Server2003的服务器(IIS版本6.0),另一台是Win ...

  7. 卸载ROS命令

    ROS有问题需要卸载只需输入以下命令: sudo apt-get purge ros-* sudo rm -rf /etc/ros

  8. 设置select和option的文字居中

    select{ width: auto;      padding: 0 1%; //左右一定要设置      margin: 0; } option{ text-align:center; }

  9. Android Http实现文件的上传和下载

    最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂.直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了 ...

  10. Mac OSX原生读写NTFS功能开启方法

    macOX系统内建的NTFS支持默认只能读不能写 原生读写NTFS,需要自行终端命令手动开启 1. 插上磁盘 此时Mac桌面应该会显示出插入的磁盘,但是当你想把文件拖入磁盘的时候,发现是不能拖进去的, ...