倍增法+LCA(C/C++)

news2024/11/25 18:55:31

目录

1  介绍

2  基本模板


1  介绍

倍增法(binary lifting),是一种每次将情况翻倍从而将线性处理转化为对数级处理,进而极大优化时间复杂度的方法。

2  基本模板

//预处理复杂度同为O(nlogn),查询时间上,ST表为O(1),线段树为O(logn)
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int a[N];//原始输入数组
//st表,表示需要查询的数组的从下标i到下标i+2^j-1的最值
int mx[N][30];//最大值 
int mn[N][30];//最小值 
 
//预处理 
void init(int n)
{
    for(int i=1;i<=n;i++){
    	mx[i][0]=a[i];
    	mn[i][0]=a[i];
	}
 
    for(int j=1;(1<<j)<=n;j++)
    {
        for(int i=1;i+(1<<j)<=n+1;i++){
        	mn[i][j] = min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);
        	mx[i][j] = max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
		}
    }
}
 
//查询函数 
int search(int l,int r)//l和r范围为1~n 
{
	int k=log2(r-l+1);
	int t1=min(mn[l][k],mn[r-(1<<k)+1][k]);//区间最小值 
	int t2=max(mx[l][k],mx[r-(1<<k)+1][k]);//区间最大值 
	return t2-t1;
}
 
int main(){
//	freopen("in.txt","r",stdin);
	int n,q;scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	init(n);
	while(q--){
		int l,r;scanf("%d%d",&l,&r);
		printf("%d\n",search(l,r));
	}
	return 0;
}

3  最近公共祖先(LCA)

 

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,rt;
int d[100],f[100][22];
int lg[100];
vector<int>G[100];

void dfs(int u,int fa)
{
	d[u]=d[fa]+1;
	f[u][0]=fa;
	//f[u][0]是父亲,然后是第二个祖先,第四个祖先,。。。以此类推 
	for(int i=0;i<lg[d[u]];++i) f[u][i+1]=f[f[u][i]][i];
	for(int i=0;i<G[u].size();i++) if(G[u][i]!=fa) dfs(G[u][i],u);
}

int lca(int x,int y)
{
	if(d[x]<d[y]) swap(x,y);            //x的深度大
	//倍增【1】:先跳到同一深度。只要前者深度大于后者,前者跳到第2^【log2(深度差)-1】(即:深度差 - 1)个祖先 
	//while(d[x]>d[y]) x = f[x][lg[d[x]-d[y]]-1]; 
	for(int i=20;i>=0;i--) if(d[f[x][i]]>=d[y]) x=f[x][i];
	if(x == y) return x;               //此时深度相同。两者相等的话说明原先的y是x的祖先。此时的x或y就是lca
	//倍增【2】:找lca。【二进制思维】从大到小尝试往上跳 
	//如果两者祖先不相等就往上跳:x跳到第2^【log2(x的深度)-1】(即:x的深度-1)个祖先 
	//鉴于x和y的深度一直一样,因此如果祖先相等,说明可能超过了lca的位置。
	for(int k = lg[d[x]]-1;k>=0;--k)           
		if(f[x][k]!=f[y][k]) x = f[x][k],y = f[y][k]; 
	return f[x][0];                   
}

void init(int n)
{
	memset(d,0,sizeof(d));
	memset(f,0,sizeof(f));
	for(int i=1;i<=n;++i) G[i].clear();
} 

int main()
{
	cin>>n>>m>>rt;
	for(int i=1;i<=n;++i) lg[i] = lg[i-1] + (1<<lg[i-1] == i);
	int x,y,k;
	for(int i=1;i<n;i++)
	{
		cin>>x>>y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	// 常数优化,求出 log2(x) + 1 
	dfs(rt,0);
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	} 
	return 0;
}

补充:蓝桥杯简介

一. 蓝桥杯赛事简介

蓝桥杯全国软件和信息技术专业人才大赛,是由工业和信息化部人才交流中心举办的全国性IT学科赛事。全国1200余所高校参赛,累计参赛人数超过40万人。蓝桥杯大赛连续两年被列入中国高等教育学会发布的“全国普通高校学科竞赛排行榜”,是高校教育教学改革和创新人才培养的重要竞赛项目。对大学生综合评测,奖学金评定,升学考研都有一定助益。

大赛共包括三个竞赛组别,个人赛-软件类,个人赛-电子类,以及视觉艺术大赛。其中个人赛-软件类的比赛科目包括C/C++程序设计、Java软件开发、Python程序设计。今年第十二届蓝桥杯报名时间是2020年12月-2021年3月,4月省赛,5月国赛。

蓝桥杯大赛已成功举办11届,成为国内始终领跑的人才培养选拔模式,并受到行业和企业的高度认可,含金量也逐年增加,主要体现在:

蓝桥杯大赛题目的专业度高,专业度和难度已经与国际国内知名程序设计类竞赛不相上下。

双一流大学的参与度逐年提高,以最近的第11届蓝桥杯大赛为例,来自双一流大校的参赛选手近10000名;

专业顶尖选手越来越多,对历年选手的跟踪回访,发现大赛选手与ACM参赛选手高度重叠,可谓赢家通吃。

二. 参加蓝桥杯的好处

大学,是人生中最美最重要的时段。在大学,有的人经历苍白,有的人经历丰富,究竟是苍白还是丰富,取决于人的选择。如果你是IT类的学生,那么,我建议你了解并参加蓝桥杯大赛。既然我这么建议,那肯定是有道理的,比如:

1. 可以丰富自己的大学经历

有的人,在大学失去了方向和斗志,浑浑噩噩,当初信誓旦旦要从事IT相关领域,最后发现,是从事打游戏这个领域,毕业前才发现,自己所学甚少。 而蓝桥杯大赛,恰好可以让你丰富自己的大学经历,不枉费专业,不虚此行。

2. 可以提供自己的实力和水平

有不少同学是很有上进心的,但苦于不知道怎么发力。那么,蓝桥杯大赛,能给你指引好方向,让你处在竞争的氛围中,牵引着你向前。通过大赛实战,不断地检验和完善自己,经历挫败和曲折后,获得成功,这种经历,尤为珍贵。

3. 可以为将来的职业铺好道路

大家都是要去求职的,在面试中,最忌讳的就是,拿不出曾经的经历和成绩,无法打动面试官和公司。有的人在面试时,只说自己爱好学习,但拿不出任何证据。相反,如果参加蓝桥杯这样的大赛,成功也好,失败也好,至少来讲,你比别人多了一块敲门砖,面试官也会对你刮目相看。

三. 蓝桥杯的备战攻略

蓝桥杯大赛,含金量在不断上升,参与的人数也在逐渐增多。前面说了,蓝桥杯大赛是个人赛,相对来说参加门槛低,分组的赛制对参赛选手也更加友好。但是,这并不意味着你可以高枕无忧。毕竟,没有人能随随便便成功。攻略和建议如下:

第一,当然是报名啦。有的朋友,准备得很充分,准备上战场的时候,才发现忘了报名或者错过报名时间。如果院校不组织参加,自己也可以选择个人报名,千万别忘记到官网报名。否则一失足成心头恨,再回首已是深秋。

第二,要充分掌握竞赛设涉及到的一些语言,熟练使用一些API, 这些东西,并不需要你死记硬背(比赛会提供相关的API说明),但肯定要有一个大概的印象。

第三,算法很重要,很重要,很重要。自己平时可以多找一些算法相关的书籍看看,对常用常见常考的算法,做到了如指掌,这样才能才大赛时随机应变。

第四,搞懂了基本的算法之后,还得实战,那就要大量刷题,刷题,刷题。蓝桥杯大赛官网有历年真题,只有通过大量刷题,才能举一反三,触类旁通,即使大赛遇到陌生题目,也不担心。

四. 关于蓝桥杯的结语

人生本来就是各种经历,大学是人生中最美好的阶段,对于身处IT浪潮中的同学而言,愿大家不负韶华,珍惜机会,丰富经历。希望有志青年,在蓝桥杯大赛中,碰撞出璀璨的智慧火花。

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

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

相关文章

[C++] 如何使用Visual Studio 2022 + QT6创建桌面应用

安装Visual Studio 2022和C环境 [Visual Studio] 基础教程 - Window10下如何安装VS 2022社区版_visual studio 2022 社区版-CSDN博客 安装QT6开源版 下载开源版本QT Try Qt | 开发应用程序和嵌入式系统 | Qt Open Source Development | Open Source License | Qt 下载完成&…

华为交换机配置Qos

QoS在企业网中的应用 在企业网络中&#xff0c;QoS的一系列技术不要求在同一台设备上应用&#xff0c;而应根据业务需要在不同位置应用。 图5 QoS技术在企业网络中的应用 理论上来说&#xff0c;各层次设备的功能如下&#xff1a; l 接入层业务识别 接入交换机LSW1作为边界…

常用工具类-Arrays

常用工具类-Arrays 数组打印创建数组比较数组数组排序和检索数组转ListsetAll 和 parallelSetAll 数组打印 Arrays提供了toString()方法&#xff0c;可以直接将数组的内容打印出来&#xff0c;极为便捷。 String[] strArr new String[] {"1","2","…

16.docker删除redis缓存数据、redis常用基本命令

1.进入redis容器内部 &#xff08;1&#xff09;筛选过滤出redis容器 docker ps | grep "redis"&#xff08;2&#xff09;进入redis容器 #说明&#xff1a;d24为redis容器iddocker exec -it d24 /bin/bash2.登陆redis (1) 进入redis命令行界面 redis-cli说明&a…

go消息队列RabbitMQ - 订阅模式-direct

1.发布订阅 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下&#xff1a; 队列与交换机的绑定&#xff0c;不能…

javaEE - 21( 15000字 Tomcat 和 HTTP 协议入门 -2)

一&#xff1a; HTTP 响应 1.1 认识 “状态码” (status code) 状态码表示访问一个页面的结果. (是访问成功, 还是失败, 还是其他的一些情况…)&#xff0c;以下为常见的状态码. 1.1.1 200 OK 这是一个最常见的状态码, 表示访问成功. 抓包抓到的大部分结果都是 200 HTTP/…

004集—二调数据库标注分子分母模式及统计净面积——arcgis

二调数据库中分子分母标注方法为&#xff1a; 表达式如下&#xff1a; "<und>"& [TBBH] &"</und>" &vbnewline& [DLBM] "<und>"&[DLBM]&"</und>" &vbnewline& [DLMC] &quo…

Anaconda的安装及其配置

一、简介 Anaconda是一个开源的包、环境管理器&#xff0c;主要具有以下功能和特点&#xff1a; 提供conda包管理工具&#xff1a;可以方便地创建、管理和分享Python环境&#xff0c;用户可以根据自己的需要创建不同的环境&#xff0c;每个环境都可以拥有自己的Python版本、库…

【零基础入门TypeScript】Union

目录 语法&#xff1a;Union文字 示例&#xff1a;Union类型变量 示例&#xff1a;Union 类型和函数参数 Union类型和数组 示例&#xff1a;Union类型和数组 TypeScript 1.4 使程序能够组合一种或两种类型。Union类型是表达可以是多种类型之一的值的强大方法。使用管道符号…

【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 状态压缩 广度优先搜索 LeetCode1494. 并行课程 II 给你一个整数 n 表示某所大学里课程的数目&#xff0c;编号为 1 到 n &#xff0c;数组 relations 中&#xff0c; relations[i] [xi, yi] 表示一个先修课的关系&am…

关于在大模型中遇到的6(colab)

来源&#xff1a;免费的GPU——colab使用教程 - 知乎 作者&#xff1a;焦龙 首先你得注册一个google账号才能用google的这些东西&#xff0c;然后你需要科学上网才能去注册google账号&#xff0c;这些我就不说了。 colab网址&#xff1a;运行代码的地方 https://colab.rese…

Hack The Box-Challenges-Misc-M0rsarchive

解压压缩包&#xff0c;里面是一张图片和一个新的zip文件 图片放大后的图案是----. 考虑到为莫斯密码&#xff0c;将其解密 密码为9&#xff0c;继续解压缩包 又是一张莫斯密码图加压缩包&#xff0c;写一段脚本去解密图片中的莫斯密码&#xff0c;并自动解压缩包 import re i…

cesium-测量高度垂直距离

cesium做垂直测量 完整代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-i…

情人节送什么礼物合适?情人节礼物最佳排行榜

​马上就要到情人节了&#xff0c;大家是否已经选好了送给爱人的礼物呢&#xff1f;如果没有&#xff0c;或许可以考虑一些优质的数码产品。随着科技的发展&#xff0c;数码产品已经成为我们生活中不可或缺的一部分。接下来&#xff0c;我将为大家推荐几款非常适合作为情人节礼…

LeetCode:2.两数相加

目录 题目&#xff1a;​编辑2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 分析问题&#xff1a; 官方的优秀代码博主的注释&#xff1a; 博主的辣眼代码&#xff0c;无注释&#xff0c;拉出来拷打自己&#xff1a; 每日表情包&#xff1a; 2. 两数相加 - 力扣&am…

什么是信创业态支持?支持信创的数据库防水坝哪家好?

随着国产化信创化的崛起&#xff0c;出现了很多新名词&#xff0c;例如信创业态支持、国产信创化等等。今天我们就来聊聊什么是信创业态支持&#xff1f;支持信创的数据库防水坝哪家好&#xff1f; 什么是信创业态支持&#xff1f; 大范围而言&#xff0c;信创业态支持可以理解…

【404App】一篇文章搞定SSL证书更换,赶紧收藏吧!

场景:阿里云服务器,nginx 第一步:下载免费证书,登录购买域名的阿里云账户,选择免费证书申请、下载(https://yundun.console.aliyun.com/?spm=5176.12818093_-1363046575.ProductAndResource–ali–widget-product-recent.2.3be916d0qj5Z8O&p=cas#/certExtend/free/…

uniapp中配置开发环境和生产环境

uniapp在开发的时候&#xff0c;可以配置多种环境&#xff0c;用于自动切换IP地址&#xff0c;用HBuilder X直接运行的就是开发环境&#xff0c;用HBuilder X发布出来的&#xff0c;就是生产环境。 1.使用HBuilder X创建原生的uniapp程序 选择vue3 2.什么都不改&#xff0c;就…

ChatGPT辅助编程,一次有益的尝试

如果大家想学习PCIe&#xff0c;搜索网上的信息&#xff0c;大概率会看到chinaaet上Felix的PCIe扫盲系列的博文 Felix-PCIe扫盲 每次看这个系列博文的时候&#xff0c;我都在想有没有什么方法可以把这个系列的博文都保存到一个pdf文件中&#xff0c;这样方便阅读。于是有了下…

嵌入式 - UART Flow Control

简介 / Introduction UART 流量控制是一种让慢速和快速设备通过 UART 相互通信而不会丢失数据的方法。 考虑两个设备通过 UART 通信的情况。发送器 T 正在向接收器 R 发送一长串字节。R 是一个比 T 慢的设备&#xff0c;在某些时候 R 无法跟上。它需要对数据进行一些处理或清空…