【蓝桥每日一题]-倍增(保姆级教程 篇1)

news2024/12/23 4:42:06

今天讲一下倍增

目录

题目:忠诚

思路:

题目:国旗计划

 思路: 


       

查询迭代类倍增:

    本质是一个一个选区间使总长度达到 M,类似凑一个数。而我们会经常用不大于它最大的二的次幂,减去之后,再重复这个过程,这样这个数的值会减小得非常快,一共只需要减 log(num) 次就可以凑出。

     

题目:忠诚

     

思路:

       

很明显是一道区间最值的问题:也就是著名的RMQ(Range Minimum/Maximum Query)区间最值查询问题(最好会背啊!)

      

首先设置f[i][j]表示从下标i走2*j长度之间的最值,然后依此创建ST表,最后RMQ查询ST表即可

    

      

#include<bits/stdc++.h>            
using namespace std;
#define maxn 100005
int n,m,l,r,a[maxn],f[maxn][22]; //f[i][j](ST表)表示从下标i走2*j长度之间的最值
int RMQ(int l,int r)//RMQ(Range Minimum/Maximum Query)区间最值查询
{
	int k=log2(r-l+1);
	return min(f[l][k],f[r-(1<<k)+1][k]);
}
void ST_create(){//创建ST表
	for(int i=1;i<=n;i++)	f[i][0]=a[i];//初始化
	int k=log2(n);
	for(int j=1;j<=k;j++){//(0已经初始化过了) j是二进制大小
		for(int i=1;i<=n-(1<<j)+1;i++){//对每个点遍历 ,n要减去j的枚举范围:n-2^j+1
			f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);//递推公式
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);//账数和问题数
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	ST_create();
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&l,&r);
		printf("%d ",RMQ(l,r));
	}
	return 0;
}

      

     

题目:国旗计划

    

思路: 


  求f[i][0]:即每个区间后选的第一个区间。肯定不能两重循环,那时间复杂度就再次变为 O(N^2),这个时候利用题目中提到的一个性质:
“每名边防战士的奔袭区间都不会被其他边防战士的奔袭区间所包含 ”
则对于单调递增l的, r也单调递增,我们只需要找到满足j.l<=r.i 的最后一个区间即可,因此使用双指针,时间复杂度降为 O(N)。
 

#include<bits/stdc++.h>           //国旗计划(环形线段覆盖)(注意线段不会包含)
using namespace std;
#define ll long long
const int N=2e5+10;
int n,m,ans[N];
int st[20][N<<1],s[20][N<<1];//st[i][j]表示从j点为起点的进行2^i次迭代的起点的下标(自身不算)
struct segment{
	int l,r,id;
	inline friend bool operator<(const segment &a,const segment &b){
		return a.l<b.l; //因为线段不会包含,所以l越大自然r越大,即l单增则r单增 !!!
	}
}a[N<<1]; //把环表转换成两倍周长的线性表
void ST_create(){
	for(int i=1,j=1;i<=2*n;i++){
		while(j<=2*n&&a[j].l<=a[i].r)  j++;//寻找下一个起点
		st[0][i]=j-1; //初始化
	}
	for(int i=1;i<=19;i++) //i是二进制大小
		for(int j=1;j<=2*n;j++) //j是对每个点遍历
			st[i][j]=st[i-1][st[i-1][j]];//状态转移方程
}
void search(){
	for(int i=1;i<=n;i++){  
		int up=a[i].l+m,an=0,p=i;//对每个点拆环范围为链范围
		for(int j=19;j>=0;j--)
			if(st[j][p]&&a[st[j][p]].r<up)  //逼近过程
				an+=1<<j,p=st[j][p]; //从下一个点开始逼近
		ans[a[i].id]=an+2;//因为本来就没算本身,然后也不算入终点,所以加2
	}
}
int main(){
	cin>>n>>m; int l,r; //n是边防战士数,m是边防站数
	for(int i=1;i<=n;i++){
		scanf("%d %d",&l,&r);
		if(l>r) r+=m;//破环成链(对战士的覆盖范围)
		a[i].l=l,a[i].r=r,a[i].id=i;//每个战士的编号
	}
	sort(a+1,a+n+1); //方便初始时找下一个转移点
	for(int i=1;i<=n;i++) {
		a[i+n].l=a[i].l+m,a[i+n].r=a[i].r+m; //破环成链(对链边界上每个边防站士都再点缀一下)
	}
	ST_create(); //创建ST表
	search();	//对每个点进行查询
	for(int i=1;i<=n;i++)
	printf("%d ",ans[i]);
	return 0;
}

 可以总结一下倍增使用的场合:
1.(最值类)RMQ区间最值
2.(迭代类)同一件事完成多次。且当“一次做一件事”可以优化为“一次做多件事”。(快速幂也是这个道理)
双指针扫描的应用:
两个指针代表的内容均只增不减
 

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

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

相关文章

VSCode中的任务什么情况下需要配置多个问题匹配器problemMatcher?多个问题匹配器之间的关系是什么?

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、简介 在 VS Code 中&#xff0c;tasks.json 文件中的 problemMatcher 字段用于定义如何解析任务输出中的问题&#xff08;错误、警告等&#xff09;。 problemMatcher是一个描述问题匹配器的接口&…

leetCode 416.分割等和子集 + 01背包 + 动态规划 + 记忆化搜索 + 递推 + 空间优化

关于此题我的往期文章&#xff1a; LeetCode 416.分割等和子集&#xff08;动态规划【0-1背包问题】采用一维数组dp:滚动数组&#xff09;_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133212716看本期文章时&…

JAVA-软开-常见八股文(2)-数据库相关

1 Drop Delete Truncate三者之间的区别和联系 drop删除整张表&#xff0c;包括表结构和表数据。用法 drop table 表名 truncate表示清空数据&#xff0c;不会删除表结构。truncate table 表名 delete表示删除数据&#xff0c;不会删除表结构。delete from 表名 where 列名 值…

虽然许多人表示对Windows 11的透明任务栏不满,但有时效果还是挺好的

Windows 11支持透明任务栏&#xff0c;这项功能可以在几秒钟内启用&#xff0c;但许多人表示他们对它的工作方式不满意。 在今天的指南中&#xff0c;我们将向你展示如何使用此功能&#xff0c;并通过一些技巧进一步自定义任务栏。 如何在Windows 11中使任务栏透明 使用个性…

【Linux】第十站:git和gdb的基本使用

文章目录 一、git的基本操作1.gitee新建仓库注意事项2.git的安装3.git的克隆4.git的add5.git的commit6.git的push7.git log8.git status9. .gitignore 二、Linux调试器---gdb1.背景2.gdb安装、进入与退出3.list/l4.r/run运行程序5. break/b 打断点6.info/i b 查看断点7.delete/…

如何使用Selenium处理Cookie,今天彻底学会了

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

搜索引擎系统简要分析

目录 一、搜索引擎简单介绍 二、搜索引擎整体架构和工作过程 &#xff08;一&#xff09;整体分析 &#xff08;二&#xff09;爬虫系统 三个基本点 爬虫系统的工作流程 关键考虑因素和挑战 &#xff08;三&#xff09;索引系统 网页处理阶段 预处理阶段 反作弊分析…

【Linux】多路IO复用技术②——poll详解如何使用poll模型实现简易的一对多服务器(附图解与代码实现)

在阅读本篇博客之前&#xff0c;建议大家先去看一下我之前写的这篇博客&#xff0c;否则你很可能会一头雾水 【Linux】多路IO复用技术①——select详解&如何使用select模型在本地主机实现简易的一对多服务器&#xff08;附图解与代码实现&#xff09;http://t.csdnimg.cn/…

arcgis pro模型构建器

如果你不想部署代码包环境来写arcpy代码&#xff0c;还想实现批量或便携封装的操作工具&#xff0c;那么使用模型构建器是最好的选择。1.简介模型构建器 1.1双击打开模型构建器 1.2简单模型构建步骤 先梳理整个操作流程&#xff0c;在纸上绘制在工具箱中找到所需工具拖进来把…

Trajectory-guided Control Prediction for End-to-end Autonomous Driving论文学习

1. 解决了什么问题&#xff1f; 端到端自动驾驶方法直接将原始传感器数据映射为规划轨迹或控制信号&#xff0c;范式非常简洁&#xff0c;从理论上避免了多模块设计的错误叠加问题和繁琐的人为规则设计。当前的端到端自动驾驶方法主要有两条独立的研究路线&#xff0c;要么基于…

学习经验分享【NO.18】YOLOv5可视化特征图教程(持续更新)

YOLOv5项目的6.0以上版本中的detect.pt中集成了可视化相关模块&#xff0c;直接调用即可。 一、可视化特征提取网络中所有模块的可视化图 添加形参如下所示&#xff0c;加载相应的权值文件后&#xff0c;选择相应的图片。 运行detect.py文件后得到如下所示&#xff1a; 以stag…

visual basic 6.0软件安装包(永久),适用于Windows各系统附安装教程

软件说明 visual basic 6.0中文版是一种由微软公司开发的包含协助开发环境的事件驱动编程语言&#xff0c;它源自于BASIC编程语言&#xff0c;拥有图形用户界面&#xff08;GUI&#xff09;和快速应用程序开发&#xff08;RAD&#xff09;系统&#xff0c;可以轻易的使用DAO、…

JavaScript处理字符串

字符串(String)是不可变的、有限数量的字符序列&#xff0c;字符包括可见字符、不可见字符和转义字符。在程序设计中&#xff0c;经常需要处理字符串&#xff0c;如复制、替换、连接、比较、查找、截取、分割等。在JavaScript中&#xff0c;字符串是一类简单值&#xff0c;直接…

基于51单片机的烟雾和温湿度检测控制系统仿真(智能防火系统,火灾报警灭火系统)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机防火 获取完整源码源文件仿真源文件论文报告说明文档等 基于51单片机的光照及温湿度检测报警控制系统 由STC89C52单片机LCD1602液晶显示屏ADC0832模块蜂鸣器DHT11温湿度传感器 烟雾传感器LED按键构成 具体功能&…

【LeetCode刷题-队列】--933.最近的请求次数

933.最近的请求次数 class RecentCounter {Queue<Integer> queue new LinkedList<>();public RecentCounter() {}public int ping(int t) {queue.offer(t);while(t - queue.peek() > 3000){queue.poll();}return queue.size();} }/*** Your RecentCounter obje…

汽车标定技术(三)--XCP协议如何支持测量功能

目录 1. 概述 2. 测量方式 -- Poll 3. 测量方式 -- DAQ 3.1 ODT概念模型 3.2 DAQ List概念 3.3 ODT 绝对编号和相对编号 3.4 静态DAQ和动态DAQ模式 &#xff08;1&#xff09;静态DAQ &#xff08;2&#xff09;动态DAQ 4.小结 1. 概述 在该系列的首篇文章汽车标定技…

如何导入HTTParty库

HTTParty是一个Ruby的HTTP客户端库&#xff0c;用于发送HTTP请求。以下是在Ruby代码中导入HTTParty库的步骤&#xff1a; 在Gemfile文件中添加HTTParty库的依赖。打开Gemfile文件&#xff0c;并在其中添加以下行&#xff1a; gem ‘httparty’ 在终端中运行bundle install命令…

FreeRTOS_事件标志组

目录 1. 事件标志组简介 2. 创建事件标志组 2.1 函数 xEventGroupCreate() 2.2 函数 xEventGroupCreateStatic() 3. 设置事件位 3.1 函数 xEventGroupClearBits() 3.2 函数 xEventGroupClearBitsFromISR() 3.3 函数 xEventGroupSetBits() 3.4 函数 xEventGroupSetB…

Linux下input子系统

文章目录 input子系统简单介绍相关的函数input_dev注册过程上报输入事件按键的input子系统实验 input子系统简单介绍 input子系统是管理输入的子系统&#xff0c;和pinctrl和gpio子系统一样&#xff0c;都是Linux内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触…

任务1 部署ChatGLM3-6B大模型并进行对话测试

部署ChatGLM3-6B大模型并进行对话测试 0 介绍&#xff1a;1 趋动云项目创建与环境配置1.1 创建项目&#xff1a;1.2 配置环境1.2.1 进入终端1.2.2 设置镜像源1.2.3 克隆项目,并安装依赖 2 修改代码&#xff0c;改路径以及启动代码3 运行代码3.1 运行gradio界面&#xff1a;3.2 …