2 月 7 日算法练习- 数据结构-树状数组上二分

问题引入

给出三种操作,
0在容器中插入一个数。
1在容器中删除一个数。
2求出容器中大于a的第k大元素。

树状数组的特点就是对点更新,成段求和,而且常数非常小。原始的树状数组只有两种操作,在某点插入一个数和求1到i的所有数的和。

这道题目一共有三种操作,但是实质上其实只有两种:插入和询问。插入操作和删除操作可以视为一种,只不过一个是将标记+1,另一个是-1,而插入的数对应于树状数组的下标,这样就可以在log(n)的时间内完成插入和删除。
求大于a的k大元素,可以通过二分枚举答案来完成,枚举的是当前答案在树状数组中的位置,设为m,然后对v[a+1]- v[m]求和就是小
于等于m的数的个数,这一步可以用树状数组的求和操作来完成,然后根据和k的比较来调整m的位置。询问的复杂度也是log(n)的。

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int maxn = 110000;
int tree[maxn];
int q;int lowbit(int x){return x&-x;
}void add(int pos,int x){while(pos<maxn){tree[pos] += x;pos += lowbit(pos);}return;
}
int query(int pos){int res = 0;while(pos){res+=tree[pos];pos -= lowbit(pos);}return res;
}int find(int a,int k){int l = a+1,r = maxn-1;int ans = -1;while(l<=r){int mid = (l+r)>>1;if(query(mid)-query(a)==k)ans = mid;if(query(mid)-query(a)>=k)r = mid-1;else l = mid +1;}return ans;
}int main( ){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>q;while(q--){int x,y,z;cin>>x;if(x==0){cin>>y;add(y,1);}else if(x==1){cin>>y;if((query(y)-query(y-1))==0)continue;add(y,-1);}else{cin>>y>>z;cout<<find(y,z)<<'\n';}}return 0;
}

算法分析

树状数组+二分复杂度可以比较直接的得到为 nlog2n

修改数组

在这里插入图片描述
思路:利用树状数组+二分。利用树状数组来快速求得区间和从而利用二分来找到第一个大于 i 的数的位置。

#include<iostream>
using namespace std;
const int maxn = 1e5+9;
int a[maxn],vis[maxn],tree[maxn];
int n;int lowbit(int x){return x&-x;
}void add(int k,int x){while(k<maxn){tree[k]+=x;k += lowbit(k);}
}int query(int k){int ans = 0;while(k){ans+=tree[k];k-=lowbit(k);}return ans;
}int main( ){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++){if(!vis[a[i]])vis[a[i]]=1,add(a[i],1);else{int l=a[i],r =maxn,ans = -1;while(l<=r){int mid = (l+r)>>1;if(query(mid)-query(a[i]-1)<mid-a[i]+1)r = mid-1,ans = mid;else l = mid+1;}a[i] = ans;vis[ans]=1;add(ans,1);}}for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[i==n];return 1;
}

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

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

相关文章

vue3:27—全局API转移到应用对象

app.componentapp.configapp.directiveapp.mountapp.unmountapp.use main.ts import {createApp} from vue import App from./App.vue import Hello from./Hello.vue // 创建应用 const app createApp(App)//全局组件 app.component(Hello,Hello)//全局属性 app.config.glob…

合并分支rebase和merge的区别

文章目录 一、前言1.1、master分支1.2、dev分支 二、合并2.1、git merge2.2、git rebase 三、总结四、最后 一、前言 实际开发工作的时候&#xff0c;我们都是在自己的分支开发&#xff0c;然后将自己的分合并到主分支&#xff0c;那合并分支用2种操作&#xff0c;这2种操作有…

使用QT编写一个简单QQ登录界面

widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(…

TCP的连接和断开详解

目录 1.TCP基础知识 1.1.TCP 头格式 1.2.TCP协议介绍 1.3.UDP协议介绍 1.4.TCP 和 UDP 区别 1.5.TCP 和 UDP 应用场景 1.6.计算机网络相关术语&#xff08;缩写&#xff09; 2.TCP 连接建立&#xff1a;三次握手 2.1.TCP 三次握手过程 2.2.三次握手原理 2.3.异常分析…

Python||数据分析与可视化_使用折线图分析各个城市的P.M.2.5月度差异情况(下)及使用堆叠柱状图对各个城市的PM2.5日均值情况进行数据分析与可视化

目录 1.使用Python折线图对各个城市的P.M.2.5月度差异情况进行数据分析与可视化。 2.使用Python堆叠柱状图对各个城市的PM2.5日均值情况进行数据分析与可视化。 1.使用Python折线图对各个城市的P.M.2.5月度差异情况进行数据分析与可视化。 import numpy as np import pandas a…

K8S系列文章之 [基于 Alpine 使用 kubeadm 搭建 k8s]

先部署基础环境&#xff0c;然后根据官方文档 K8s - Alpine Linux&#xff0c;进行操作。 将官方文档整理为脚本 整理脚本时&#xff0c;有部分调整 #!/bin/shset -x # 添加源&#xff0c;安装时已经配置 #cat >> /etc/apk/repositories <<"EOF" #htt…

Python进程之并行与并发的区别

并行 : 当系统有一个以上CPU时&#xff0c;则进程的操作有可能非并发。当一个CPU执行一个进程时&#xff0c;另一个CPU可以执行另一个进程&#xff0c;两个进程互不抢占CPU资源&#xff0c;可以同时进行&#xff0c;这种方式我们称之为并行。 并发 : 当有多个进程在操作时&…

Optimism Collective 为 Covalent Network(CQT)提供价值 20 万美元的生态系统资助

Covalent Network&#xff08;CQT&#xff09; 是 Web3 生态系统中关键的“数据可用性”层&#xff0c;在与 Optimism Collective 多年的合作中取得了骄人的成果。Covalent Network&#xff08;CQT&#xff09;对于 Optimism 跨链数据的增长产生了直接的影响&#xff0c;而这一…

第三百一十五回

文章目录 1. 概念介绍2. 基本用法3. 补充用法4. 内容总结 我们在上一章回中介绍了"再谈ListView中的分隔线"&#xff0c;本章回中将介绍showMenu的用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在第一百六十三回中介绍了showMenu相关的内容…

一图窥探RAG技术发展现状

2023年除了大语言模型&#xff0c;听到最多的当属RAG&#xff08;检索增强生成技术了&#xff09;&#xff0c;在实际业务场景落地过程中&#xff0c;由于大模型目前的一定局限和能力现状以及Token限制、训练成本等多种因素的影响下&#xff0c;RAG不得不成为大家选择快速试错、…

学习前端的开始

什么是前端 Web前端&#xff0c;用来直接给用户呈现一个一个的网页一个软件通常情况下是由后端前端完成。 后端通常情况下通过Java,C这样一个编程语言来完成一个相关的逻辑处理&#xff0c;将数据返回给前端。 前端的工作把后端返回给自己的数据进行一系列拼装/组装之后&#…

6、5 门关于 AI 和 ChatGPT 的免费课程,带您从 0-100

5 门关于 AI 和 ChatGPT 的免费课程,带您从 0-100 想在 2024 年免费了解有关 AI 和 ChatGPT 的更多信息吗? 图片由 DALLE 3 提供 活着是多么美好的时光啊。还有什么比现在更适合了解生成式人工智能(尤其是 ChatGPT)等人工智能元素的呢!许多人对这个行业感兴趣,但有些…

AI存储趋势预测2024

随着企业不断面临管理复杂多源数据、优化性能、扩展混合/多云环境以及高效运营的挑战&#xff0c;数据策略将更加依赖于能够应对这些挑战的解决方案。 预测的主要趋势&#xff1a; AI/ML领域&#xff1a; 计算能力成为新的“石油”&#xff1a;由于GPU需求增长远超行业供应&…

RK3588平台开发系列讲解(AI 篇)什么是NPU

文章目录 一、什么是NPU二、什么是RKNPU沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解什么是NPU。 一、什么是NPU 📢什么是 NPU 呢? 在谈这个问题之前,可以先来看看什么是 CPU 和 GPU,CPU 就是中央处理器,中央处理器就好像是人类的大脑,主要负…

MySQL进阶45讲【15】“order by“是怎么工作的?

1 前言 在开发应用的时候&#xff0c;一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例&#xff0c;假设要查询城市是“杭州”的所有人名字&#xff0c;并且按照姓名排序返回前1000个人的姓名、年龄。 假设这个表的部分定义是这样…

Redis 使用 RDB 持久化方式的过程

定时触发&#xff1a; RDB 持久化是通过设置一个定时触发的机制来进行的。管理员可以配置 Redis 在经过一定时间间隔或执行了一定数量的写操作后触发 RDB 持久化。这个配置通常在 Redis 的配置文件中进行&#xff0c;可以通过 save 或 save 900 1 这样的配置项来设定。 save 90…

政安晨:快速学会~机器学习的Pandas数据技能(三)(重命名与合并)

使用机器学习处理数据的第一步就得先理解它&#xff0c;咱们现在就帮助它们一起理解起来。 &#xff08;本篇文章这次换一套数据集&#xff0c;数据文件可以在文章头部下载&#xff0c;并保存至您的虚拟环境的目录中&#xff09; 不知道如何搭建环境的小伙伴请看我机器学习笔…

文件上传总结:用原生解决前端文件上传操作(单个,多个,大文件切片)

目录 第一章 前言 第二章 理解文件上传的对象 2.1 如何利用原生实现 2.2 认识理解文件上传的四个对象 2.2.1 file对象 2.2.2 blob对象 2.2.3 formData对象 2.2.4 fileReader对象 2.2.4.1 了解fileReader对象基本属性 2.2.4.2 了解 fileReader对象基本方法 2.2.4.3…

【高阶数据结构】位图布隆过滤器

文章目录 1. 位图1.1什么是位图1.2为什么会有位图1.3 实现位图1.4 位图的应用 2. 布隆过滤器2.1 什么是布隆过滤器2.2 为什么会有布隆过滤器2.3 布隆过滤器的插入2.4 布隆过滤器的查找2.5 布隆过滤器的模拟实现2.6 布隆过滤器的优点2.7 布隆过滤器缺陷 3. 海量数据面试题3.1 哈…

mysql 对于null字段排序处理

最近遇到一个需求 &#xff0c;需要对一个报表的多个字段进行多字段复杂条件排序 排序字段为NULL时 Mysql对于排序字段为NULL时&#xff0c;有自身默认的排序规则&#xff0c;默认是认为null 值 是无穷小 ELECT id,script_id,last_modified,live_count,next_show FROM virtua…