AcWing 1275. 最大数—线段树单点修改

news2024/10/11 0:24:11

题目链接 AcWing 1275. 最大数

题目描述
在这里插入图片描述

分析
这道题是线段树的模板题,属于一眼ding真,鉴定为线段树的裸题,正好用来学习线段树。线段树、树状数组等数据结构题,难的地方是在如何分析出来要用哪个数据结构解决。
线段树要比树状数组要好理解一些,但是线段树的代码难写一些,且支持的操作多一些。线段树是以区间来考虑问题,保存的基本信息有区间的左边界、右边界、区间的属性(sum、min、max…)等等。
在这里插入图片描述
拿区间[1,10]举例,可分为如图所示的小区间,由于这里和堆很像,所以也是用数组来存所有的点,最多不超过4n个区间。能使用线段树的题有一些特点,就是大区间的属性能从小区间得到,比如求max,max([1,10])=max{max([1,5]),max(6,10)},线段树一共有4个基本操作,分别是
build:建立线段树
pushup:由两个子区间更新父区间,例如max([1,10])=max{max([1,5]),max(6,10)}
query:查询某区间
modify:修改某个点(这里只考虑单点修改,不考虑区间修改需要的懒标记pushdown操作)

一般用结构体来保存信息,需要4n个点

struct E{
    int l,r,v;
}tr[N*4];

build操作就是建立线段树,代码如下,类似于建堆的过程

void build(int u,int l,int r){
    tr[u].l=l;//当前区间的左边界
    tr[u].r=r;//当前区间的右边界
    if(l==r) return;//当前节点为叶子节点,则返回
    int mid=l+r>>1;
    build(u<<1,l,mid);//建立左子边界
    build(u<<1|1,mid+1,r);//建立右子边界
}

pushup:由两个子区间更新父区间,代码如下

void pushup(int u){
    tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v);//这里是求区间max
}

query:查询某区间,代码如下

int query(int u,int l,int r){
    if(l<=tr[u].l&&r>=tr[u].r) return tr[u].v;//如果查询的区间包含了线段树的区间,则返回该线段树区间的值
    int mid=tr[u].l+tr[u].r>>1;
    int v=0;
    if(l<=mid) v=query(u<<1,l,r);//这里是求区间max
    if(r>mid) v=max(v,query(u<<1|1,l,r));
    return v;
}

modify:修改某个点(这里只考虑单点修改,不考虑区间修改需要的懒标记pushdown操作)

void modify(int u,int x,int v){//修改和查询类似
    if(tr[u].l==x&&tr[u].r==x) tr[u].v=v;
    else{
        int mid=tr[u].l+tr[u].r>>1;
        if(x<=mid) modify(u<<1,x,v);
        else modify(u<<1|1,x,v);
        pushup(u);//这里修改了叶子节点之后要回溯更新一下父节点,否则父节点保存的信息还是之前的信息
    }
}

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2e5+10;

struct E{
    int l,r,v;
}tr[N*4];
int m,p;

void build(int u,int l,int r){
    tr[u].l=l;
    tr[u].r=r;
    if(l==r) return;
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
}
void pushup(int u){
    tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v);
}
int query(int u,int l,int r){
    if(l<=tr[u].l&&r>=tr[u].r) return tr[u].v;
    int mid=tr[u].l+tr[u].r>>1;
    int v=0;
    if(l<=mid) v=query(u<<1,l,r);
    if(r>mid) v=max(v,query(u<<1|1,l,r));
    return v;
}
void modify(int u,int x,int v){
    if(tr[u].l==x&&tr[u].r==x) tr[u].v=v;
    else{
        int mid=tr[u].l+tr[u].r>>1;
        if(x<=mid) modify(u<<1,x,v);
        else modify(u<<1|1,x,v);
        pushup(u);
    }
}
int main(){
    int n=0,last=0;
    cin>>m>>p;
    build(1,1,m);
    while(m--){
        char op[2];
        int x;
        scanf("%s%d",op,&x);
        if(*op=='Q'){
            last=query(1,n-x+1,n);
            cout<<last<<endl;
        }
        else{
            modify(1,n+1,((ll)last+x)%p);
            n++;
        }
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/790072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

上海VR全景展示,快速了解VR全景拍摄

导语&#xff1a; 随着科技的不断进步&#xff0c;虚拟现实技术的应用日益广泛。在这其中&#xff0c;VR全景图片作为一种数字化助力的全景拍摄方式&#xff0c;正逐渐成为人们关注的焦点。通过数字化技术&#xff0c;VR全景图片能够以360度全方位的视角呈现真实的场景&#x…

docker学习和进阶2023

文末有下载地址。如有侵权请联系作者谢谢&#xff01; docker学习和进阶2023 参考引用 docker学习笔记&#xff1a;https://blog.csdn.net/m0_46188681/article/details/128993319 Docker容器配置和资源限制&#xff1a;https://www.cnblogs.com/xiugeng/p/16254087.html 容…

idea使用命令将jar包导入到maven仓库中

因为今天突然忘了命令&#xff0c;记下来方便以后查看 pom文件的依赖 jar包路径 进入idea中命令窗 输入命令 mvn install:install-file -DfileD:\Project\spring-cloud\dubbo-api\target\dubbo-api-1.0-SNAPSHOT.jar -DgroupIdcom.wmx -DartifactIddubbo-api -Dversion1.0…

flutter数字动画库:animated_flip_counter

前言 在数字动画的制作中&#xff0c;有时候我们会面临时间紧张或效果不尽如人意的情况。这时&#xff0c;使用现成的动画库或工具可以大大提高效率&#xff0c;同时也能够获得更好的效果。animated_flip_counter就是一个非常不错的数字动画库&#xff0c;可以帮助我们快速地创…

Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】

题目 给定一个整数数组和一个整数 k &#xff0c;请找到该数组中和为 k 的连续子数组的个数。 示例 1&#xff1a; 输入:nums [1,1,1], k 2输出: 2解释: 此题 [1,1] 与 [1,1] 为两种不同的情况 示例 2&#xff1a; 输入:nums [1,2,3], k 3输出: 2 提示: 1 < nums.leng…

SIP视频对讲sip广播网关

SV-PA2是专门对行业用户需求研发的一款SIP音视频对讲&#xff0c;媒体流传输采用标准IP/RTP/RTSP协议。它很好的继承了锐科达话机稳定性好、电信级音质的优点&#xff0c;且完美兼容当下所有基于SIP的主流IPPBX/软交换/IMS平台,如Asterisk, Broadsoft, 3CX, Elastix 等。它集多…

linux 使用nethogs命令查看各个进程使用网络的情况

1&#xff0c;使用nethogs命令查看各个进程使用网络的情况 #yum -y install nethogs 2&#xff0c;使用nethogs命令查看进程使用网络的情况 #nethogs

【Docker】Docker部署私有仓库的配置及应用

文章目录 一、Docker-registry 搭建本地私有仓库1. Registry 的概念2. Registry 的部署过程 二、Docker-harbor 搭建私有仓库1. 什么是Harbor2. Harbor 的特性3. Harbor的构成4. Harbor 的部署过程4.1 安装 harbor4.2 创建项目并进行上传下载4.3 上传镜像到私有仓库4.4 从私有仓…

LLM Data Pipelines: 解析大语言模型训练数据集处理的复杂流程

编者按&#xff1a;在训练大语言模型的过程中,构建高质量的训练数据集是非常关键的一步&#xff0c;但关于构建大模型训练所需数据集的通用数据处理流程&#xff08;Data pipelines)的相关资料极为稀少。 本文主要介绍了基于Common Crawl数据集的数据处理流程。首先,文章概述了…

Java版知识付费源码 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台 +支持二次开发定制

提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发…

SNMP协议是什么?

SNMP协议是什么&#xff1f; 简单网络管理协议&#xff08;Simple Network Management Protocol&#xff0c;SNMP&#xff09;是由互联网工程任务组定义的一套网络管理协议。该协议是基于简单网关监视协议&#xff08;Simple Gateway Monitor Protocol&#xff0c;SGMP&#x…

芯片制造详解.晶圆的诞生.学习笔记(二)

芯片制造详解.晶圆的诞生.学习笔记.二 一、硅片的制造二、硅片、晶圆和芯片的区别三、从硅棒到晶圆(1).截断(2).四探针法(3).裁成硅段(4).滚磨(5).研磨定位边(槽)(6).硅段切片(7).磨片(8).倒角(9).打上激光标识码(10).刻蚀(11).化学机械抛光(CMP)(12).湿法清洗(13).检测 包装 四…

Nodejs 安装之后cmd 输入npm -v 提示error的问题解决

1.问题现象&#xff1a; 安装时候选择&#xff1a; 2. 解决问题 卸载nodejs 删除安装路径下的node_modules, 重新安装 按照下面的选择

指数函数exp

目录 指数函数及e 指数增长 复数指数 练习 1. expgui 2. 计算e 3 五角星绘制 指数函数及e &#xff08;1&#xff09;的比值总是常数 &#xff08;2&#xff09;的导数为其自身。&#xff08;根据比值1推导出e的值&#xff09; %% Plot a^t and its approximate derivat…

vue预览和下载txt、PDF、execl等在线文件

因为浏览器默认能直接打开TXT、PDF等文件索引默认就是点击链接打开文件。但是浏览器却又不能在线打开execl、world等文件。 现在我们可以统一的实现文件的预览以及下载。 下载文件 downloadfile方法 downloadfile(url,fileName){const newUrl url;const x new XMLHttpRequ…

Rust vs Go:常用语法对比(七)

题图来自 Go vs Rust: Which will be the top pick in programming?[1] 121. UDP listen and read Listen UDP traffic on port p and read 1024 bytes into buffer b. 听端口p上的UDP流量&#xff0c;并将1024字节读入缓冲区b。 import ( "fmt" "net&qu…

C数据结构与算法——队列 应用(C语言纯享版 迷宫)

实验任务 (1) 掌握顺序循环队列及其C语言的表示&#xff1b; (2) 掌握入队、出队等基本算法的实现&#xff1b; (3) 掌握顺序循环队列的基本应用&#xff08;求解迷宫通路&#xff09;。 实验内容 使用C语言实现顺序循环队列的类型定义与算法函数&#xff1b;编写main()函数…

架构设计-高性能(一、存储高性能)

1.简介 数据存储的性能是系统高性能的两大组成部分之一。目前市场的数据存储技术是五花八门&#xff0c;并且目前针对在大数据环境下针对不同的需求和场景提出了更多不同类型的数据库。本文主要讲解分类中的关系型数据库和NoSql数据库的高性能。 2.关系型数据库 虽然存储技术在…

ClickHouse(二):ClickHouse特性

​目录 1. 完备的DBMS功能 2. 列式存储 3. 数据压缩 4. 向量化执行引擎 5. 关系模型与标准SQL查询 ​​​​​​​6. 多样化的表引擎 ​​​​​​​7. 多线程与分布式 ​​​​​​​8. 多主架构 ​​​​​​​9. 交互式查询 ​​​​​​​10. 数据分片与分布式查询…

03 shell 编程

变量 语言型 编译型语言 解释型语言 shell脚本语言是解释型语言shell脚本的本质&#xff1a;shell命令的有序集合 shell 编程的基本过程 基本过程分为三步&#xff1a; step1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本文件; step2. 赋予shell文件执行…