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

相关文章

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口