uva 11992 线段树对矩阵进行更新查询

2024-05-28 05:08

本文主要是介绍uva 11992 线段树对矩阵进行更新查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3143


把矩阵变成一行,然后计算位置,lrj给了线段树数组做法 但是我做的线段树空间过大,直接爆掉,所以换方法了

主要还是测试自己的线段树区间更新的模板

各种RE+WA之后AC,,,,,


做的时候出现的几个错误:

1、行和列弄错

2、build初始化的时候,mmin mmax 都初始化为0才对



#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;#define lson(i) l , mid , (i)*2
#define rson(i) mid + 1 , r , ((i)*2 +1)
#define ll rt*2
#define rr (rt*2+1)const int INFMIN = 0xffffffff;
const int INFMAX = 1000000009;//0x80000000;
const int MAXN = 30001000;
struct Node{int l,r;int mmax,mmin,sum,add,s;/*s去标记是不是被set*/
};
Node nodes[MAXN];int mmax,mmin,sum;void PushUp(int rt){nodes[rt].mmax = max(nodes[ll].mmax,nodes[rr].mmax);nodes[rt].mmin = min(nodes[ll].mmin,nodes[rr].mmin);nodes[rt].sum = nodes[ll].sum + nodes[rr].sum;}void PushDown(int rt){//if(nodes[rt].add && flag == 1)if(nodes[rt].add){nodes[ll].add += nodes[rt].add;nodes[ll].mmin += nodes[rt].add;nodes[ll].mmax += nodes[rt].add;nodes[rr].add += nodes[rt].add;nodes[rr].mmin += nodes[rt].add;nodes[rr].mmax += nodes[rt].add;nodes[ll].sum += nodes[rt].add*(nodes[ll].r-nodes[ll].l+1);nodes[rr].sum += nodes[rt].add*(nodes[rr].r-nodes[rr].l+1);nodes[rt].add = 0;}//if(nodes[rt].s && flag == 2)if(nodes[rt].s){nodes[ll].s = nodes[rr].s=nodes[rt].s;nodes[ll].mmin = nodes[ll].mmax = nodes[rr].mmax = nodes[rr].mmin = nodes[rt].mmax;nodes[ll].sum = nodes[rt].mmin*(nodes[ll].r-nodes[ll].l+1);nodes[rr].sum = nodes[rt].mmin*(nodes[rr].r-nodes[rr].l+1);nodes[ll].add = nodes[rr].add = 0;//nodes[rt].s=0;}}void Build(int l,int r,int rt){nodes[rt].l=l;nodes[rt].r=r;nodes[rt].add =0;nodes[rt].s=0;nodes[rt].sum =0;nodes[rt].mmin=0;nodes[rt].mmax=0;if(l == r){//nodes[rt].mmin = nodes[rt].mmax = nodes[rt].sum =a[l];nodes[rt].mmin = nodes[rt].mmax = nodes[rt].sum =0;return ;}int mid = (nodes[rt].l+nodes[rt].r)/2;Build(lson(rt));Build(rson(rt));//PushUp(rt);}void Update(int l,int r,int add,int rt,int flag){
/
//printf("rt=%d l=%d r=%d add=%d flag =%d nodes[rt].l=%d nodes[rt].r=%d\n",rt,l,r,add,flag,nodes[rt].l,nodes[rt].r);if(l<=nodes[rt].l && nodes[rt].r<=r){if(flag == 1)/*increase*/{nodes[rt].mmax += add;nodes[rt].mmin += add;nodes[rt].add += add;nodes[rt].sum += add*(nodes[rt].r-nodes[rt].l+1);}else{nodes[rt].mmax = add;nodes[rt].mmin = add;nodes[rt].add=0;nodes[rt].s=1;nodes[rt].sum = add*(nodes[rt].r-nodes[rt].l+1);}return;}PushDown(rt);int mid = (nodes[rt].l+nodes[rt].r)/2;if(l<=mid)Update(l,r,add,ll,flag);if(r>mid)Update(l,r,add,rr,flag);PushUp(rt);}void Query(int l,int r,int rt)/*1表示mmin 2--mmax 3-sum*/{/
//printf("rt=%d l=%d r=%d  nodes[rt].l=%d nodes[rt].r=%d\n",rt,l,r,nodes[rt].l,nodes[rt].r);///if(l<=nodes[rt].l && nodes[rt].r<=r){mmin = min(mmin,nodes[rt].mmin);mmax = max(mmax,nodes[rt].mmax);sum += nodes[rt].sum;return ;}PushDown(rt);int mid = (nodes[rt].l+nodes[rt].r)/2;if(l<=mid)Query(l,r,ll);if(r>mid)Query(l,r,rr);PushUp(rt);}void clr()/*每次查询之前使用*/{sum =0;mmin=INFMAX;mmax=INFMIN;}int main()
{//freopen("uva11992.txt","r",stdin);int r,c,m,v,flag,x1,y1,x2,y2;while(scanf("%d%d%d",&r,&c,&m)!=EOF){Build(1,r*c,1);while(m--){scanf("%d%d%d%d%d",&flag,&x1,&y1,&x2,&y2);if(flag<3){scanf("%d",&v);for(int i=x1;i<=x2;i++)/*此处注意*/{
///
//printf("i=%d\n",i);Update(y1+(i-1)*c,y2+(i-1)*c,v,1,flag);}}else{int anssum=0,ansmin=INFMAX,ansmax=INFMIN;for(int i=x1;i<=x2;i++){clr();Query(y1+(i-1)*c,y2+(i-1)*c,1);// printf("**min=%d\n",mmin);/anssum+=sum;ansmax=max(ansmax,mmax);ansmin=min(ansmin,mmin);}printf("%d %d %d\n",anssum,ansmin,ansmax);}}}return 0;
}




这篇关于uva 11992 线段树对矩阵进行更新查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009626

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

MYSQL查询结果实现发送给客户端

《MYSQL查询结果实现发送给客户端》:本文主要介绍MYSQL查询结果实现发送给客户端方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql取数据和发数据的流程(边读边发)Sending to clientSending DataLRU(Least Rec

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y