解题思路:

  将矩阵每一行建立一棵线段树,进而变成一维问题求解。注意数组要开 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. replace all

    OPTION COPY OUTREC FINDREP=(INOUT=(X'0E',X'400E', X'0F',X'0F40'))

  2. openssl生成证书 - CSDN博客

    大家都可以生成公钥.私钥对,无法确认公钥对到底是谁的. 如果能够确定公钥到底是谁的,就不会有这个问题了.例如,如果收到“黑客”冒充“服务器”发过来的公钥,经过某种检查,如果能够发现这个公钥不是“服务器 ...

  3. Linux安装mongoDB步骤和方法

    Linux安装mongoDB步骤和方法 下载mongoDB数据库 mongodb-linux-x86_64-3.0.15.tgz 存放到linux文件夹中 ftp软件直接拖上去 解压文件夹(解压后,会 ...

  4. 数据库 Mysql-mongodb-redis

    目录 1. Mysql 1.1. 介绍 1.1.1 基础 1.1.3 数据库操作 1.2. 查询 1.2.1 条件 1.2.2 聚合 1.2.3 分组 1.2.4 排序 1.2.4 分页 1.3. 高 ...

  5. 纯CSS3绘制的黑色图标按钮组合

    在线演示 本地下载

  6. QT 引用之前项目模板导致计算速度严重下降

    最近做RRT规划算法,在新建工程中测试时,每一个周期大概花费20MS,但是当我把算法移植到之前写的工程模板中时,计算效率相当低,变为500毫秒.期初是以为代码有问题,然后就逐句查找,发现代码并没有问题 ...

  7. Nginx 外的另一选择,轻量级开源 Web 服务器 Tengine 发布新版本

    新版发布 近日,轻量级开源 Web 服务器 Tengine 发布了2.3.0版本,新增如下特性: ngx_http_proxy_connect_module,该模块让 Tengine 可以用于正向代理 ...

  8. Path Sum 深度搜索

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  9. Kubernetes1.4即将发布

    (一)发布历史 Kubernetes 1.0 - 2015年7月发布 Kubernetes 1.1 - 2015年11月发布 Kubernetes 1.2 - 2016年3月发布 Kubernetes ...

  10. Java练习 SDUT-3268_飞花的糖果

    飞花的糖果 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一日,飞花壕大手一挥,买了N个的两两不相同糖果,他想要拿出M ...