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

相关文章

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详