uva11992 - Fast Matrix Operations 区间修改 二维线段树

ESD防护设计宝典(十):RE(辐射发射)超标问题排查与解决 RE测试是EMC认证的“头号杀手”。当屏幕上出现一根根超标频谱线时,如何快速定位元凶并有效整改?本讲将带你化身电磁侦探,完成一次完美的RE问题“缉凶”。 阅读详情

Problem F

Fast Matrix Operations

There is a matrix containing at most 106 elements divided into r rows and c columns. Each element has a location (x,y) where 1<=x<=r,1<=y<=c. Initially, all the elements are zero. You need to handle four kinds of operations:

1 x1 y1 x2 y2 v

Increment each element (x,y) in submatrix (x1,y1,x2,y2) by v (v>0)

2 x1 y1 x2 y2 v

Set each element (x,y) in submatrix (x1,y1,x2,y2) to v

3 x1 y1 x2 y2

Output the summation, min value and max value of submatrix (x1,y1,x2,y2)

In the above descriptions, submatrix (x1,y1,x2,y2) means all the elements (x,y) satisfying x1<=x<=x2 and y1<=x<=y2. It is guaranteed that 1<=x1<=x2<=r, 1<=y1<=y2<=c. After any operation, the sum of all the elements in the matrix does not exceed 109.

Input

There are several test cases. The first line of each case contains three positive integers r, c, m, where m (1<=m<=20,000) is the number of operations. Each of the next m lines contains a query. There will be at most twenty rows in the matrix. The input is terminated by end-of-file (EOF). The size of input file does not exceed 500KB.

Output

For each type-3 query, print the summation, min and max.

Sample Input

4 4 8
1 1 2 4 4 5
3 2 1 4 4
1 1 1 3 4 2
3 1 2 4 4
3 1 1 3 4
2 2 1 4 4 2
3 1 2 4 4
1 1 1 4 3 3

Output for the Sample Input

45 0 5
78 5 7
69 2 7
39 2 7

  这个题真好。。

  任意区间都能分解成不超过2h个不相交区间的并,这是区间修改和点修改的区别。

  二维线段树,其实就是一些一维线段树。。每一行看成一个线段树,矩阵修改就变成了把每一行的线段树修改。这里add操作其实是不需要pushdown的,但是为了方便,少写点代码,不管是set还是add都pushdown。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<sstream>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<stack>
#define INF 0x3f3f3f3f
#define MAXN 25
#define MAXM 510
#define MAXNODE 1<<17
#define eps 1e-9
#define pi 4*atan(1.0)
#define pii pair<int,int>
using namespace std;
int T,R,C,M,op,x1,y1,x2,y2,v,_sum,_min,_max;

//修改、查询区间均为[y1,y2]
struct IntervalTree{
    //同一结点先考虑set,再考虑add
    //sumv[o],minv[o],maxv[o]保存的是以o为根结点的树内修改后的和,最大,最小值,o的父节点及以上结点修改的情况没有包括在里面
    int setv[MAXNODE],addv[MAXNODE],sumv[MAXNODE],minv[MAXNODE],maxv[MAXNODE];

    void maintain(int o,int L,int R){
        int lc=(o<<1),rc=(o<<1)+1;
        if(L<R){
            sumv[o]=sumv[lc]+sumv[rc];
            minv[o]=min(minv[lc],minv[rc]);
            maxv[o]=max(maxv[lc],maxv[rc]);
        }
        if(setv[o]>=0){
            sumv[o]=setv[o]*(R-L+1);
            minv[o]=maxv[o]=setv[o];
        }
        if(addv[o]){
            sumv[o]+=addv[o]*(R-L+1);
            minv[o]+=addv[o];
            maxv[o]+=addv[o];
        }
    }

    //把o结点的set和add都往下推一层
    void pushdown(int o){
        int lc=(o<<1),rc=(o<<1)+1;
        if(setv[o]>=0){
            setv[lc]=setv[rc]=setv[o];
            setv[o]=-1;
            addv[lc]=addv[rc]=0;
        }
        if(addv[o]){
            addv[lc]+=addv[o];
            addv[rc]+=addv[o];
            addv[o]=0;
        }
    }

    void update(int o,int L,int R){
        if(y1<=L&&y2>=R){
            if(op==1) addv[o]+=v;
            else{
                setv[o]=v;
                addv[o]=0;
            }
        }
        else{
            pushdown(o);
            int mid=(L+R)/2,lc=(o<<1),rc=(o<<1)+1;
            if(y1<=mid) update(lc,L,mid);
            else maintain(lc,L,mid);    //更新过的子树会自动maintain,没有更新的子树也要maintain,因为在pushdown的时候可能被修改
            if(y2>mid) update(rc,mid+1,R);
            else maintain(rc,mid+1,R);
        }
        maintain(o,L,R);
    }

    void query(int o,int L,int R,int add){    //add是o结点的父结点及以上结点增加的值,也要被加入o
        if(setv[o]>=0){    //set是个例外,不需要[L,R]包含在[y1,y2]中
            int v=setv[o]+addv[o]+add;
            _sum+=v*(min(R,y2)-max(L,y1)+1);    //两个区间的交集
            _min=min(_min,v);
            _max=max(_max,v);
        }
        else if(y1<=L&&y2>=R){
            _sum+=sumv[o]+add*(R-L+1);
            _min=min(_min,minv[o]+add);
            _max=max(_max,maxv[o]+add);
        }
        else{
            int mid=(L+R)/2,lc=(o<<1),rc=(o<<1)+1;
            if(y1<=mid) query(lc,L,mid,add+addv[o]);
            if(y2>mid) query(rc,mid+1,R,add+addv[o]);
        }
    }

}tree[MAXN];

int main(){
    freopen("in.txt","r",stdin);
    while(scanf("%d%d%d",&R,&C,&M)!=EOF){
        memset(tree,0,sizeof(tree));
        for(int i=1;i<=R;i++){
            memset(tree[i].setv,-1,sizeof(tree[i].setv));
            tree[i].setv[1]=0;
        }
        while(M--){
            scanf("%d%d%d%d%d",&op,&x1,&y1,&x2,&y2);
            if(op<3){
                scanf("%d",&v);
                for(int i=x1;i<=x2;i++) tree[i].update(1,1,C);
            }
            else{
                _sum=0;
                _min=INF;
                _max=-INF;
                for(int i=x1;i<=x2;i++) tree[i].query(1,1,C,0);
                printf("%d %d %d\n",_sum,_min,_max);
            }
        }
    }
    return 0;
}



069、自动曝光(AE)测光策略:全局/中心/点测光与曝光时间增益分配 本文深入探讨了自动曝光(AE)测光策略的技术细节与实际应用。作者通过多个真实案例(手机前置摄像头、车载ADAS、安防监控等)分析了全局测光、中心测光和点测光的优缺点,指出不同场景应采用不同策略。重点剖析了曝光时间与增益分配的"跷跷板效应",提出要根据传感器特性选择最优分配方案。文章强调测光策略应动态调整,并给出5条实用建议:结合场景切换测光模式、关注传感器增益拐点、点测光需防抖处理、全局测光不宜迷信、调试要观察亮度直方图。最后指出AE调试需要结合具体硬件特性进行实测优化,没有通用解决方案。 阅读详情

相关推荐

c764-基于Vue的实时温湿度监控系统

🌟 毕业设计指导交流 🌟 同学们好!作为一名计算机专业的技术爱好者,我在毕业设计领域积累了一些经验,希望能和大家分享交流。从选题到答辩,欢迎一起探讨技术问题。💡 技术方向: 熟悉Java全栈(SSM/Spring Boot)、Python数据分析、微信小程序/安卓开发等技术栈,可以互相学习项目开发经验。📂 学习资源: 整理了一些开源项目案例(含代码和文档),需要参考的同学可以留言讨论,也欢迎分享你的项目经验。🛠 交流内容:✨ 欢迎在评论区留言讨论,一起进步!记得遵守社区规范,保持学术

weixin_39513710的博客 1069

【UVA11992】Fast Matrix Operations——二维线段树

UVA11992 给你 一个矩阵和一些的操作,计算子矩阵的和,最大值,最小值。1表示矩阵所有的元素加v,2表示矩阵所有的元素变为v,3表示查询区间的信息。由于最大只有20行,所以对于每一行建立一颗线段树。进行区间操作,比较恶心的是区间加和区间更改的关系。

绝尘 640

在Mac下配置用VSCode编写C/C++程序的环境

前言    最近需要编写一些C/C++程序,由于体量都不是很大所以想要追求一个轻量化的编辑和编译环境,于是想起了在Dock栏吃灰的VSCode。通过查找资料,包括VSCode的官方文档,最终配置实现了Mac下基于VSCode的C/C++编辑环境搭建。 正文    在配置环境之前先检查一下机器上都安装了什么C++编译器,通过以下两条命令可以查看是否安装了g++/clang编译器,本人两种编...

Kalikali的专栏 5万+

二维线段树(uva11992)

封装一个线段树包含 维护信息,标记,maintain,pushdown,update,query操作 #include<bits/stdc++.h> #define ls p<<1 #define rs p<<1|1 using namespace std; const int N=1<<18; const int inf=1e9+5; int _max,_sum,_min,op,x,y,x2,y2,v,r,c,m,i,j; struct tree{

xuwnehao的博客 201

大模型时代的具身智能系列专题(二)

自由形式语言指令 L 指定了一个操作问题,例如“打开最顶部的抽屉”。然而,根据 L 生成机器人轨迹是很困难的,因为 L 可能具有任意长度,或者是不明确的(例如,需要上下文语义)。相反,我们专注于问题的各个阶段(子任务)l_i,它们明确地指定了一个操作任务 (例如,“抓住抽屉把手”,“打开抽屉”),其中被分解的子阶段(子任务)L→l1l2lnL→l1​l2​...ln​由高级规划器(例如,一个LLM或一个基于搜索的规划器)给出。

achao的专栏 2171

IoTDB时序数据库在Windows下的保姆级安装教程(含环境变量配置避坑指南)

本文提供Apache IoTDB时序数据库在Windows系统下的详细安装与配置指南。教程涵盖从Java环境检查、软件下载解压,到环境变量配置的深度避坑,并详解了服务的启动、停止、连接测试及基础数据操作,帮助物联网开发者在Windows平台快速搭建稳定的时序数据库环境。

weixin_29275257的博客 261

HDU4819之二维线段树

题目传送门:http://vjudge.net/contest/131028#problem/G题意: 给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l),求出该区域内的最大值(A)和最小值(B),输出(A+B)/2,并用这个值更新矩阵[x,y]的值。树套树的做法,外层线段树的一个节点由内层线段树构成,内层线段树和普通线段树一样。见代码://http://vjudge.net/contes

superxtong的博客 396

新手避坑指南:HT7036计量芯片SPI读取电压的完整流程(从复位到校准)

本文详细介绍了HT7036计量芯片的SPI读取电压完整流程,从硬件准备到校准设置,重点解析了复位引脚处理、SPI通信配置、芯片初始化及数据处理等关键步骤。针对常见问题如晶振焊接、SPI时序错误等提供实用解决方案,帮助开发者高效完成电压测量与校准。

weixin_30070339的博客 326

二维线段树 uva11992

这题开始一位很简单,因为涉及到的操作前面已经讲过了,但是可能真的太年轻,想错了。对于线段树,有了更深的了解,但是离熟悉还差的远。看模板 代码我可以看得懂,但是真正要盲打真的是有心无力。 思路:这道题的基本思路不难,有先成代码可以实现,不过要想到的关键点是:把一个矩阵看作是多个线段树。(一行对应一棵线段树),然后每次循环对对应的线段树进行操作。所以定义一个封装了线段树所有操作的结构体,这样不仅实现

RockyHOO1209的博客 386

MBIST --- PATR2.Memorybist 测试流程

mem bist作为现在design设计中不可或缺的DFT设计内容,越发重要。本章节主要介绍mem bist的flow,如何在tessent中实现mbist以及tessent中的一些命令和mode。

sinat_27691203的博客 6004

零样本缺陷检测新体验:用AnomalyGPT大模型快速搭建智能质检系统(附Win10适配指南)

本文详细介绍了如何利用AnomalyGPT大模型在Windows 10系统上快速搭建零样本工业缺陷检测系统。通过实战指南,涵盖从环境部署、模型准备到工程化落地的全过程,包括将模型封装为API服务、接入工业相机以及开发可视化监控看板,为制造业智能质检提供了一套高效、低门槛的本地部署解决方案。

weixin_29094775的博客 310

UVA 11992

7

大咸鱼。。。 515

HTML炫酷烟花④(完整代码)

HTML语言实现炫酷烟花的完整代码。

AIGC 9万+

UVA11992 Fast Matrix Operations

线段树 区间增加+区间覆盖

a free man 629

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

UVA11992:Fast Matrix Operations(线段树)

题意: 有一个初始状态全为0的矩阵,一共有三个操作 1 x1 y1 x2 y2 v:子矩阵(x1,y1,x2,y2)所有元素增加v 2 x1 y1 x2 y2 v:子矩阵(x1,y1,x2,y2)所有元素设为v 3 x1 y1 x2 y2 v:查询子矩阵(x1,y1,x2,y2)的元素和,最大值和最小值 思路: 因为总元素葛素不超过10^6,而且更新是对于连续的行进行更新,

ACM!荣耀之路! 1782

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Uva11992 Fast Matrix Operations(线段树区间修改+更新)

题意:给定一个n * m矩阵,三种操作,一种是给一个子矩阵每个元素加v,第二种是将子矩阵的所有元素修改为v,第三种是查询子矩阵的所有元素和,最大值,最小值 思路:二维转换为一维,用线段树进行区间更新,修改和查询 #include #include #include #include #include #include #include #include #include #include #i

hnust_Derker的博客 440

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

uva11992 Fast Matrix Operations (线段树)

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18697 题意:给定N*M的矩阵,初始值为0。有三种操作①将x1~x2行的y1~y2列的值加v(v>0)②将x1~x2行的y1~y2列的值改为v(v>0)③查询x1~x2行的y1~y2列里面的所有值的和,以及其中的最小值和最大值。(N 分析:由于N 开始的版

w20810的专栏 505

UVA 11992 Fast Matrix Operations 线段树

UVA 11992有一个r行c列的全0矩阵,查询个数是m,支持一下3种操作,op x1 y1 x2 y2 v,op=1时子矩阵全部加v,op=2时子矩阵全部设为v,op=3时求子矩阵的元素和以及最小值,最大值。因为题目说了矩阵不超过20行且元素总和不超过1e6,可以把二维化一维,x1 y1到x1 y2可以换成 (x1-1)*c+y1到 (x1-1)*c+y2接下来就是套用刘汝佳的模板了,因为一个细...

ccsu_cat 318

UVA 11992 - Fast Matrix Operations(线段树区间更新)

题目链接 https://cn.vjudge.net/problem/UVA-11992 【题意】 有一个r行c列的全0矩阵,支持以下3种操作 1 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素增加v(v&gt;0) 2 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素设为v(v&gt;0) 3 x1 y1 x2 y2&nbsp;&nbsp;...

Change the world by program. 251

UVA 11992 Fast Matrix Operations 线段树

UVA 11992 对矩阵操作我们容易想到二维线段树或者二维树状数组 但是这题不需要二维 由于r&lt;=20 所以我们开20个线段树就可以记录了 不过要注意一下set和add的先后顺序即可 #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;iostream&gt; #include &lt;stack&gt; #i...

我是谁 --- 卡比兽 234

UVA - 11992 Fast Matrix Operations (线段树 + 懒标记)

对于每一个查询和修改x1,x2,y1,y2,我们分别对每一行的线段树处理就行;(3).再考虑打懒标记时要怎么维护?(这个懒标记是没有后效性的!区间变成一个数,区间+一个数,区间查询最值和矩阵和?(1)pushup时这个简单,区间和,区间最值。这个我们看一下数据范围,矩阵最多只有20行;(2).直接考虑pushdown怎么维护?对于每一行开一个线段树,分别维护就行;其实这个题之前写过了《迪拜的超市》那我们就不用二维线段树了;...

qq_53398102的博客 158

uva 11992 Fast Matrix Operations (线段树区间修改,模板题)

e[i]给出第i个点对应的区间范围 s[k][i]给出矩阵第k行的线段树第i个点对应的区间的和 x[k][i]维护最小值 d[k][i]维护最大值 #include &lt;cstdio&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; #define inf 0x3f3f3f3f using namespace std; ...

GaoJieVery6 255

UVA 11992 Fast Matrix Operations

线段树。初始为零的矩阵,有三种操作,选出子矩阵来修改,增加,和查询总和,最小值,最大值。可以二维线段树,但仁慈的出题人说:There will be at most twenty rows in the matrix(最多20行)。就可以用一维来解了。注意add标记和set标记的先后逻辑顺序即可。 #pragma comment(linker, "/STACK:1024000000,1024

DotACM 1054

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

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

weixin_30600197的博客 81

UVA11992--Fast Matrix Operations

题意:一个r*c的矩阵,初始值全部为0,后进行三种操作,1 子矩阵[x1,y1]--[x2,y2]所有元素+v,#include&lt;bits/stdc++.h&gt; #define MAX 3000100 using namespace std; struct node { int l,r; int mini,maxi,sum; int add,set; }a[MAX...

AAAAAAAC的博客 220
上一篇: uva1400 区间最大连续和 线段树
下一篇: uva11525 - Permutation 线段树加速康托展开
小小小小葱
博客等级 码龄14年 22粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值