注意 setsetset 和 addvaddvaddv 标记的下传。

我们可以控制懒惰标记的优先级。

由于 setsetset 操作的优先级高于 addaddadd 操作,当下传 setsetset 操作时可直接强制清空 addaddadd 的 lazylazylazy。

实际上,当一个节点同时存在 setsetset 和 addaddadd 标记时,一定是先有的 setsetset 再被 addaddadd,因为如果反之,该节点上的 addaddadd标记会被清空。

#include<cstdio>                //Fast Matrix Operations
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 200000 + 2;
typedef long long ll;
ll sumv[maxn * 2+1][21];
int minv[maxn * 2+1][21], maxv[maxn * 2+1][21];
int lazy[maxn * 2+1][21], set[maxn * 2+1][21];
int chk;
int _min, _max;
void init(){
memset(sumv, 0, sizeof(sumv));
memset(minv, 0, sizeof(minv));
memset(maxv, 0, sizeof(maxv));
memset(lazy, 0, sizeof(lazy));
memset(set, 0, sizeof(set));
}
void down(int L,int R,int o,int id){
int mid = (L + R) / 2;
if (set[o][id]) {
int k=set[o][id];
set[o * 2][id] = set[o * 2 + 1][id] = k;
sumv[o * 2][id] = (mid - L + 1)*k, sumv[o * 2 + 1][id] = (R - mid)*k; //更新sum
minv[o * 2][id] = maxv[o * 2][id] = minv[o * 2 + 1][id] = maxv[o * 2 + 1][id] = k; //更新minv,maxv
lazy[o * 2][id] = lazy[o * 2 + 1][id] = 0;
set[o][id] = 0;
}
if (lazy[o][id]){
int k = lazy[o][id];
lazy[o * 2][id] += k, lazy[o * 2 + 1][id] += k;
sumv[o * 2][id] += (mid - L + 1)*k, sumv[o * 2 + 1][id] += (R - mid)*k;
minv[o * 2][id] += k, maxv[o * 2][id] += k, minv[o * 2 + 1][id] += k, maxv[o * 2 + 1][id] += k;
lazy[o][id] = 0;
}
}
void update(int l, int r,int k, int o, int id, int L, int R){
if (l <= L&&r >= R){
if (chk == 1)
{
lazy[o][id] += k;
sumv[o][id] += (R - L + 1)*k;
minv[o][id] += k, maxv[o][id] += k;
}
if (chk == 2) {
lazy[o][id] = 0;
sumv[o][id] = (R - L + 1)*k;
minv[o][id] = maxv[o][id] = k;
set[o][id] = k;
}
}
else{
int mid = (L + R) / 2;
down(L,R,o,id);
if (l <= mid)update(l, r, k, o * 2, id, L, mid);
if (r > mid)update(l, r, k, o * 2 + 1, id, mid + 1, R);
minv[o][id] = min(minv[o * 2][id], minv[o * 2 + 1][id]);
maxv[o][id] = max(maxv[o * 2][id], maxv[o * 2 + 1][id]);
sumv[o][id] = sumv[o * 2][id] + sumv[o * 2 + 1][id];
}
}
ll query(int l, int r, int o, int id, int L, int R){
if (l <= L&&r >= R) { //包含
_min = min(minv[o][id], _min);
_max = max(maxv[o][id], _max);
return sumv[o][id];
}
else
{
int mid = (L + R) / 2;
ll a = 0;
down(L,R,o,id);
if (l <= mid)a += query(l, r, o * 2, id, L, mid);
if (r > mid)a += query(l, r, o * 2 + 1, id, mid + 1, R);
maxv[o][id] = max(maxv[o * 2][id], maxv[o*2+1][id]);
minv[o][id] = min(minv[o * 2][id],minv[o * 2 + 1][id]);
sumv[o][id] = sumv[o * 2][id] + sumv[o * 2 + 1][id];
return a;
}
}
int main(){
int r, c, m;
while (scanf("%d", &r) != EOF)
{
scanf("%d%d",&c, &m);
init();
for (int i = 1; i <= m; ++i)
{
scanf("%d", &chk);
int x1, y1, x2, y2, v;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
if (chk<3)
{
scanf("%d", &v);
for (int j = x1; j <= x2; ++j) update(y1, y2, v, 1, j, 1, c);
}
if (chk == 3)
{
_min = 10000000 + 123, _max = -12345;
ll p=0;
for (int j = x1; j <= x2; ++j)
p += query(y1, y2, 1, j, 1, c);
printf("%lld ", p);
printf("%d %d\n", _min, _max);
}
}
}
return 0;
}

uva 11992 Fast Matrix Operations 线段树模板的更多相关文章

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

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

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

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

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

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

  4. UVA 11992 Fast Matrix Operations (二维线段树)

    解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...

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

    题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...

  6. uva 11992 - Fast Matrix Operations

    简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...

  7. UVA 11992 Fast Matrix Operations (降维)

    题意:对一个矩阵进行子矩阵操作. 元素最多有1e6个,树套树不好开(我不会),把二维坐标化成一维的,一个子矩阵操作分解成多条线段的操作. 一次操作的复杂度是RlogC,很容易找到极端的数据(OJ上实测 ...

  8. UVA11992 - Fast Matrix Operations(段树部分的变化)

    UVA11992 - Fast Matrix Operations(线段树区间改动) 题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v ...

  9. 【UVA】11992 - Fast Matrix Operations(段树模板)

    主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...

随机推荐

  1. LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)

    很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题意: 请自行阅读 题解首先我们显然要求的是几个随机变量的最大值的期望(不是期望的最大值),然后这玩意很难求 ...

  2. 00063_String类

    1.String类的概述 (1)String 类代表字符串: (2)Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现: (3)字符串是常量,它们的值在创建 ...

  3. 怎么样调整FreeBSD时区问题

    一般我们在安装系统的时候,都会遇到服务器时间不同步的情况.所以必须得设置为中国时区,比较简单的方法,就总结如下几点: 1.通过命令行启动图形界面更改 #sysinstall 请选择 configure ...

  4. Ningx初学

    原文地址 1. 到官网下载Ningx 2. 启动 2.1双击nginx.exe图标,可见黑窗口一闪而过,启动完毕. 2.2 命令行到nginx目录,输入nginx启动.(注,此方式命令行窗口无任何提示 ...

  5. codevs——T1043 方格取数

    http://codevs.cn/problem/1043/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 De ...

  6. HDU 5355 Cake

    HDU 5355 Cake 更新后的代码: 今天又一次做这道题的时候想了非常多种思路 最后最终想出了自觉得完美的思路,结果却超时 真的是感觉自己没救了 最后加了记忆化搜索,AC了 好了先说下思路吧.不 ...

  7. Think In java 笔记一

    本博客不再更新,很多其它精彩内容请訪问我的独立博客 今天起要读这本书了,曾经都没有认真读过书.是时候改变自己了. 如今认为不是写不出代码,而是没有想法,没有架构,要做一个大神不是写多少代码.而是要能做 ...

  8. iOS开发-自己定义重用机制给ScrollerView加入子视图

    事实上这个问题我非常早就想过,仅仅是没有通过去写程序实现,昨天有人提起,我就巧了一下 不知道大家打印郭tableview:cellforrow中cell初始的次数,也就是重用池中的cell个数.这个是 ...

  9. root用户不能改动iptables

    需求:因为防火墙做了IP和port限制,如今须要加入一条规则使之能够訪问指定的IP和port. vi /etc/sysconfig/iptables, 加入完毕后,wq保存,提示文件仅仅读无法保存.! ...

  10. [2-SAT] poj 3207 Ikki&#39;s Story IV - Panda&#39;s Trick

    题目链接: id=3207">http://poj.org/problem? id=3207 Ikki's Story IV - Panda's Trick Time Limit: 1 ...