当前位置: 首页 > news >正文

[蓝桥杯] 树状数组与线段树问题(C/C++)

 

文章目录

一、动态求连续区间和

1、1 题目描述

1、2 题解关键思路与解答

二、数星星

2、1 题目描述

2、2 题解关键思路与解答

三、数列区间最大值

3、1 题目描述

3、2 题解关键思路与解答


标题:树状数组与线段树问题

作者:@Ggggggtm

寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景

一、动态求连续区间和

1、1 题目描述

题目来源:《信息学奥赛一本通》,Acwing模板题

题目难度:简单

题目描述:给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。

输入格式:

  第一行包含两个整数 n 和 m,分别表示数的个数和操作次数。

  第二行包含 n 个整数,表示完整数列。

  接下来 m 行,每行包含三个整数 k,a,b (k=0,表示求子数列[a,b]的和;k=1,表示第 a 个数加 b)。

  数列从 1 开始计数。

输出格式:

  输出若干行数字,表示 k=0时,对应的子数列 [a,b] 的连续和。

数据范围:

  1≤n≤100000,
  1≤m≤100000,
  1≤a≤b≤n,
  数据保证在任何时候,数列中所有元素之和均在 int 范围内。

输入样例:

10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8

输出样例:

11
30
35

1、2 题解关键思路与解答

  我们知道求一段区间的和用前缀和数组会很方便,时间复杂度也很快。但是当修改数组的数据时,我们又要重新求前缀和数组,这样下来时间复杂的就较高了,为O(n*n)的级别的。这个时候我们就可以用到树状数组来求解。树状数组是一个一维数组,每个位置存储的数据是一段区间的和。以下为书抓鬼呢数组的模板:我们只需要记住树状数组有三个比较重要的函数,lowbit(找下一个要操作的数)、add(改变大小)、query(求区间和)。我们看代码:

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;int n, m;
int a[N], tr[N];int lowbit(int x)
{return x & -x;
}void add(int x, int v)
{for (int i = x; i <= n; i += lowbit(i)) tr[i] += v;
}int query(int x)
{int res = 0;for (int i = x; i; i -= lowbit(i)) res += tr[i];return res;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);for (int i = 1; i <= n; i ++ ) add(i, a[i]);while (m -- ){int k, x, y;scanf("%d%d%d", &k, &x, &y);if (k == 0) printf("%d\n", query(y) - query(x - 1));else add(x, y);}return 0;
}

二、数星星

2、1 题目描述

题目来源:《信息学奥赛一本通》 , Ural 1028

题目难度:中等

题目描述:

天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标。

如果一个星星的左下方(包含正左和正下)有 k 颗星星,就说这颗星星是 k 级的。

例如,上图中星星 5 是 3 级的(1,2,4 在它左下),星星 2,4 是 1 级的。

例图中有 1 个 0 级,2 个 1 级 1 个 2 级,1 个 3 级的星星。

给定星星的位置,输出各级星星的数目。

换句话说,给定 N 个点,定义每个点的等级是在该点左下方(含正左、正下)的点的数目,试统计每个等级有多少个点。

输入格式:

第一行一个整数 N,表示星星的数目;

接下来 N 行给出每颗星星的坐标,坐标用两个整数 x,y 表示;

不会有星星重叠。星星按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出。

输出格式:

N 行,每行一个整数,分别是 0 级,1 级,2 级,……,N−1 级的星星的数目。

数据范围:

1≤N≤15000,
0≤x,y≤32000。

输入样例:

5
1 1
5 1
7 1
3 3
5 5

输出样例:

1
2
1
1
0

2、2 题解关键思路与解答

  我们仔细分析上述题目,题目中说道:不会有星星重叠。星星按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出。也就是输入的星星的做标顺序是按照从下往上,从左往右依次给出的。我们只需要判断该星星的左下方位置有多少个星星来确定等级就行。由于是按照坐标顺序给出的,所以这就给我们的统计带来了很大的方便。我们只需要看该坐标的横坐标,有多少个比该做的横坐标小的数就是星星的个数。在统计时还不断插入新坐标,相当于就是动态求数组的前缀和,我们在这里就可以利用树状数组即可解决问题。我们看代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;const int N=32010;int n;int c[N],level[N];int lowbit(int x)
{return x&-x;
}int sum(int x)
{int res=0;for(int i=x;i;i-=lowbit(i))res+=c[i];return res;
}void add(int x)
{for(int i=x;i<N;i+=lowbit(i))c[i]++;
}
int main()
{cin>>n;for(int i=0;i<n;i++){int x,y;scanf("%d%d",&x,&y);x++;level[sum(x)]++;add(x);}for(int i=0;i<n;i++)printf("%d\n",level[i]);
}

三、数列区间最大值

3、1 题目描述

题目来源:《信息学奥赛一本通》

题目难度:中等

题目描述:输入一串数字,给你 M 个询问,每次询问就给你两个数字 X,Y,要求你说出 X 到 Y 这段区间内的最大数。

输入格式:

  第一行两个整数 N,M 表示数字的个数和要询问的次数;

  接下来一行为 N 个数;

  接下来 M 行,每行都有两个整数 X,Y。

输出格式:

  输出共 M 行,每行输出一个数。

数据范围:

  1≤N≤1e5,
  1≤M≤1e6,
  1≤X≤Y≤N,
  数列中的数字均不超过2^31−1

输入样例:

10 2
3 2 4 5 6 8 1 2 9 7
1 4
3 8

输出样例:

5
8

3、2 题解关键思路与解答

  我们正常可以想到的就是暴力循环,时间复杂度为O(n*n)的级别。题目中歌的数据范围较大,所以暴力是通过不了的。我们这个时候就可以使用线段树。线段树可以动态求一段区间的和、一段区间的最大值、最小值等问题。这个题中我们就是要求一段区间的最大值。什么是线段树呢?线段树是一棵平衡二叉树。母结点代表整个区间的和,越往下区间越小。注意,线段树的每个节点都对应一条线段(区间),但并不保证所有的线段(区间)都是线段树的节点,这两者应当区分开。

  我们在使用线段树时,通常会先建立一个结构体,该结构体包含左右区间,以及要求的值。每个节点 u 的左右子节点的编号分别为 2u 和 2u+1 ,假如节点 u 储存区间 [l,r] 的和,设 mid=⌊(l+r/)2⌋ ,那么两个子节点分别储存 [l, mid] 和 [mid+1,r] 的和。可以发现,左节点对应的区间长度,与右节点相同或者比之恰好多1。

  线段树有四个重要的函数:pushup(通过子节点向上求父节点的和)、build(通过递归建立线段树)、query(求一段区间的最大值或最小值或 和)、modify(修该某个值)。

  我们来结合本题的代码一起理解一下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<climits>using namespace std;const int N=1e5+10;int w[N];struct Node
{int l,r;int maxv;
}tr[4*N];void build(int u,int l,int r)
{if(l==r)tr[u]={l,r,w[r]};else{tr[u]={l,r};int mid=l+r>>1;build(u<<1,l,mid),build(u<<1 | 1,mid+1,r);tr[u].maxv=max(tr[u<<1].maxv,tr[u<<1 | 1].maxv);}
}int query(int u,int l,int r)
{if(tr[u].l>=l && tr[u].r<=r)return tr[u].maxv;int mid=tr[u].l+tr[u].r>>1;int maxv=INT_MIN;if(l<=mid)maxv=query(u<<1,l,r);if(r>mid)maxv=max(maxv,query(u<<1|1,l,r));return maxv;
}
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&w[i]);build(1,1,n);int l,r;while(m--){scanf("%d%d",&l,&r);printf("%d\n",query(1,l,r));}return 0;
}

相关文章:

[蓝桥杯] 树状数组与线段树问题(C/C++)

文章目录 一、动态求连续区间和 1、1 题目描述 1、2 题解关键思路与解答 二、数星星 2、1 题目描述 2、2 题解关键思路与解答 三、数列区间最大值 3、1 题目描述 3、2 题解关键思路与解答 标题&#xff1a;树状数组与线段树问题 作者&#xff1a;Ggggggtm 寄语&#xff1a;与其…...

Matlab-Loma Prieta 地震分析

此示例说明如何将带时间戳的地震数据存储在时间表中以及如何使用时间表函数来分析和可视化数据。 加载地震数据 示例文件quake.mat包含 1989 年 10 月 17 日圣克鲁斯山脉 Loma Prieta 地震的 200 Hz 数据。这些数据由加州大学圣克鲁斯分校查尔斯F里希特地震实验室的 Joel Yelli…...

Spring Boot全局异常处理

使用注解方式处理全局异常使用 ControllerAdvice &#xff08;RestControllerAdvice&#xff09; 配合 ExceptionHandler适用于返回数据的请求&#xff08;一般是RESTful接口规范下的JSON报文&#xff09;package com.example.exception;import org.slf4j.Logger; import org.s…...

websocket每隔5秒给服务端send一次信息

websocket轮询每隔5秒给服务端send一次信息&#xff0c;主要功能点如下&#xff1a;socket 采用了定时器 setInterval&#xff08;&#xff09; 需要清除定时器否则会报错监听了突然关闭浏览器窗口&#xff0c;destroyed里面直接监听 window.removeEventListener("beforeu…...

2023年中职网络安全——SQL注入测试(PL)解析

SQL注入测试(PL) 任务环境说明: 服务器场景:Server2312服务器场景操作系统:未知(关闭链接)已知靶机存在网站系统,使用Nmap工具扫描靶机端口,并将网站服务的端口号作为Flag(形式:Flag字符串)值提交。访问网站/admin/pinglun.asp页面,此页面存在SQL注入漏洞,使用排…...

利用蜜罐捕捉攻击实验(31)

预备知识 1、蜜罐的含义和作用 蜜罐(Honeypot)是一种在互联网上运行的计算机系统。它是专门为吸引并诱骗那些试图非法闯入他人计算机系统的人(如电脑黑客)而设计的&#xff0c;蜜罐系统是一个包含漏洞的诱骗系统&#xff0c;它通过模拟一个或多个易受攻击的主机&#xff…...

PyTorch深度学习实战 | 自然语言处理与强化学习

PyTorch是当前主流深度学习框架之一&#xff0c;其设计追求最少的封装、最直观的设计&#xff0c;其简洁优美的特性使得PyTorch代码更易理解&#xff0c;对新手非常友好。本文主要介绍深度学习领域中自然语言处理与强化学习部分。自然语言区别于计算机所使用的机器语言和程序语…...

测牛学堂:接口测试基础理论和工具的使用

接口测试流程总结 1 需求分析&#xff0c;看产品经理的需求文档 2 接口文档解析&#xff0c;开发编写的api接口文档 3 设计测试用例 4脚本开发 5 执行及缺陷跟踪 6 生成测试报告 7接口自动化持续集成 测试解析接口文档 接口文档&#xff0c;又称为api文档&#xff0c;是由后…...

定长内存池的实现

解决的是固定大小的内存申请释放需求&#xff1a; 性能达到极致不考虑内存碎片问题(统一使用自由链表管理还回来的空间) 为了避免命名污染&#xff0c;不要直接using namespace std;只展开常用的。 #include <iostream> using std::cout; using std::endl;申请空间时有…...

三更草堂springSecurity的学习

源码地址&#xff1a;学习springSecurity (gitee.com) git&#xff1a;https://gitee.com/misszyg/spring-security.git 一&#xff0c;认证流程 1&#xff0c;经过UsernamePasswordAuthenticationFilter &#xff08;1&#xff09;传入了用户的账号&#xff0c;密码 源码&a…...

【C语言】指针的深度理解(一)

前言 我们已经了解了指针的概念&#xff0c;一是指针变量是用来存放地址的&#xff0c;每个地址都对应着唯一的内存空间。二是指针的大小是固定的4或8个字节&#xff08;取决于操作系统&#xff0c;32位的占4个字节&#xff0c;64位的占8个字节&#xff09;。三是指针是有类型…...

Kafka最佳实践

前言 Kafka 最佳实践&#xff0c;涉及 典型使用场景Kafka 使用的最佳实践 Kafka 典型使用场景 Data Streaming Kafka 能够对接到 Spark、Flink、Flume 等多个主流的流数据处理技术。利用 Kafka 高吞吐量的特点&#xff0c;客户可以通过 Kafka 建立传输通道&#xff0c;把应…...

入门教程: 认识 React用于构建用户界面的 JavaScript 库

课前准备 我们将会在这个教程中开发一个小游戏。你可能并不打算做游戏开发,然后就直接跳过了这个教程——但是不妨尝试一下!你将在该教程中学到关于构建 React 应用的基础知识,掌握这些知识后,你将会对 React 有更加深刻的理解。 这篇教程分为以下几个部分: 环境准备是学…...

极紫外光源高次谐波发生腔不同区域真空度精密控制解决方案

摘要&#xff1a;在高次谐波发生器中一般包含两个不同真空区域&#xff0c;一个是1~100Torr绝压范围的气池内部的低真空区域&#xff0c;一个是高阶谐波光路上的绝压为0.001Pa量级的高真空区域。本文针对此两个区域的真空度控制提出了相应的解决方案&#xff0c;特别是详细介绍…...

「Vue面试题」在vue中为什么data属性是一个函数而不是一个对象

文章目录一、实例和组件定义data的区别二、组件data定义函数与对象的区别三、原理分析四、结论一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象&#xff0c;也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"…...

如何使用 ChatGPT 编写 SQL JOIN 查询

通过清晰的示例和解释&#xff0c;本文展示了 ChatGPT 如何简化和简化创建复杂 MySQL 查询的过程&#xff0c;使用户更容易与数据库交互并检索他们需要的数据。无论您是初学者还是经验丰富的开发人员&#xff0c;本文都提供了有关如何利用 ChatGPT 来增强您的 MySQL 查询编写技…...

vue2+elementUI完成添加学生删除学生案列

效果图&#xff1a; 点击添加学生按钮&#xff0c;弹出Dialog,收集用户信息&#xff1a; el-table中自定义复选框&#xff0c;选中一行&#xff0c;可以点击删除 代码区域&#xff1a;就一个HTML文件 <!DOCTYPE html> <html lang"en"> <head>&…...

对void的深度理解

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; void前言一、 void 关键字二、 void修饰函数返回值和参数三、void指针3.1void * 定义的…...

哪款游戏蓝牙耳机好用?好用的游戏蓝牙耳机推荐

现在&#xff0c;不少人喜欢戴蓝牙耳机玩游戏&#xff0c;而在戴蓝牙耳机玩游戏时难免会产生音画不同步的问题。现在越来越多的蓝牙耳机支持游戏模式&#xff0c;那么&#xff0c;哪款游戏蓝牙耳机好用&#xff1f;接下来&#xff0c;我来给大家推荐几款好用的游戏蓝牙耳机&…...

求职(怎么才算精通JAVA开发)

在找工作的的时候,有时候我们需要对自己的技术水平做一个评估。特别是Java工程师,我们该怎么去表达自己的能力和正确认识自己所处的技术水平呢。技术一般的人,一般都不敢说自己精通JAVA,因为你说了精通JAVA几乎就给了面试官一个可以随便往死里问的理由了。很多不自信的一般…...

C++网络编程(三)IO复用

C网络编程(三)IO复用 前言 多进程/多线程网络服务端在创建进程/线程时&#xff0c;CPU和内存开销很大。因为多线程/进程并发模型&#xff0c;为每个socket分配一个线程/进程。而IO复用采用单个的进程/线程就可以管理多个socket。 select 系统调用原型&#xff1a; #includ…...

第十四届蓝桥杯(第三期)模拟赛试题与题解 C++

第十四届蓝桥杯&#xff08;第三期&#xff09;模拟赛试题与题解 C 试题 A 【问题描述】 请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。  请将这个…...

【Hive 基础】-- 数据倾斜

1.什么是数据倾斜&#xff1f;由于数据分布不均匀&#xff0c;导致大量数据集中到一点&#xff0c;造成数据热点。常见现象&#xff1a;一个 hive sql 有100个 map/reducer task&#xff0c; 有一个运行了 20分钟&#xff0c;其他99个 task 只运行了 1分钟。2.产生数据倾斜的原…...

计算机网络笔记——物理层

计算机网络笔记——物理层2. 物理层2.1 通信基础2.1.1 信号2.1.2 信源、信道及信宿2.1.3 速率、波特及码元2.1.4 带宽2.1.5 奈奎斯特定理采样定理奈奎斯特定理2.1.6 香农定理2.1.7 编码与调制调制数字信号调制为模拟信号模拟数据调制为模拟信号编码数字数据编码为数字信号模拟数…...

算法第十七期——状态规划(DP)之动态压缩

一、总述 状态压缩动态规划&#xff0c;就是我们俗称的状压DP&#xff0c;是利用计算机二进制的性质来描述状态的一种DP方式。 应用背景&#xff1a;以集合为状态&#xff0c;且集合可以用二进制来表示&#xff0c;用二进制的位运算来处理。集合问题一般是指数复杂度的&#x…...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第八套解析(详细)

2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (8) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...

【华为OD机试真题 JAVA】数组中是否存在满足规则的数字组合

标题:数组中是否存在满足规则的数字组合 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 给定一个正整数数组,检查数组中是否存在满足规则的数字组合 * 规则: * A = B + 2C 输入描述: * 第一行输出数组的元素个数。 * 接下来一行输出所有数组元素,用空格…...

【OpenCV技能树】——OpenCV基础

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; 目前正在进行 OpenCV技能树的学习&#xff0c;OpenCV是学习图像处理理论知识比较好的一个途径&#xff0c;至少比看书本来得实在。本专栏文章主要记录学习Op…...

人体姿态识别

自留记录论文阅读,希望能了解我方向的邻域前沿吧 粗读,持续更新 第一篇 ATTEND TO WHO YOU ARE: SUPERVISING SELF-ATTENTION FOR KEYPOINT DETECTION AND INSTANCE-AWARE ASSOCIATION 翻译:https://editor.csdn.net/md?not_checkout=1&spm=1001.2014.3001.5352&…...

ubuntu下调试驱动

使用 Ubuntu Linux 测试 Linux 驱动 1. 测试 Linux 驱动准备工作 ​ 对于一个 Linux 驱动程序&#xff0c;一开始可以在 Ubuntu Linux 上做前期开发和测试。对于访问硬件部分也可以在 Ubuntu Linux 用软件进行模拟,切记不能代替真实的环境&#xff01;当基本开发完成后&#…...

赣州建设信息网/购买seo关键词排名优化官网

Objects类是一个提供对象基础操作的工具类&#xff0c;其提供的方法包括null-safe或tolerant-safe的对象hashcode计算&#xff0c;toString和比较等。所在路径&#xff1a;javautilObjects.javaObjects类方法列表一、构造器Objects类被final修饰&#xff0c;不能被继承。其构造…...

卖东西怎么做网站/qq代刷网站推广免费

2019独角兽企业重金招聘Python工程师标准>>> 服务器上启动一个java程序&#xff0c;其他服务器正常&#xff0c;有一个老是失败&#xff0c;最后发现了&#xff1a; The stack size specified is too small, Specify at least 228k 我的jvm参数是&#xff1a; -ser…...

怎么和其他网站交换友情链接/营销策划书

使用 React Native 构建移动应用程序比你想象的要容易——那是因为它使用了 JavaScript&#xff0c;这是一种易于学习的编程语言。在该项目一位经验丰富的开发人员的帮助下&#xff0c;你可以节省时间和金钱&#xff0c;并创建一个具有原生感觉和外观的应用程序。 React Native…...

织梦做网站视频教程/营销推广方案设计

方一 Integer[] xnew Integer[]{4,6,9,10}; Set<Integer> set new HashSet<>() ; Collections.addAll(set,x);for(Integer ele:set){System.out.println(ele); }方二 Set<Integer> set new HashSet<>(Arrays.asList(4,6,9,10)) ;...

医联媒体网站建设/沧州网络推广公司

7.1 导入敏捷项目管理的步骤 1.导入敏捷的步骤 (1).培训 (2).教练与引导 (3).内化 2.敏捷混合型模式 7.2 项目启动与敏捷合同 1.敏捷项目启动 2.敏捷签约模式 在传统项目管理框架下的委外项目要采用敏捷&#xff0c;必须要将项目进行方式和所要采用的敏捷过程与实践&#xff…...

漳州网站建设公司首选公司/网站seo课程

mvn -v 查看maven版本 compile 编译 test 测试 package 打包 clean 删除target install 安装jar包到项目 使用 archetype 创建目录文件 mvc archetype:generate 转载于:https://www.cnblogs.com/panzi/p/7683790.html...