第十四届蓝桥杯第三次模拟——复盘
创始人
2024-05-29 07:05:05
0

第三次模拟延续了前两次模拟的一贯风格(水的一批 ),虽然都不难,还是有几道还行的题目,下面讲解最后一题,以此来复习一下前面学过的知识

问题描述:

小蓝有一个序列a[1],a[2],…,a[n]。给定一个正整数k,请问对于每一个1到n之间的序号i.a[i-k],a[i-k+1]…a[i+K]
这2k+1个数中的最小值是多少?当某个下标超过1到n的范围时,数不存在,求最小值时只取存在的那些值。

输入格式:

输入的第一行包含一整数n。 第二行包含n个整数,分别表示 a[1],a[2],…,a[n]。 第三行包含一个整数k

输出格式:

输出一行,包含n个整数,分别表示对于每个字号求得的最小值

样例输入:

5
5 2 7 4 3
1

样例输出:

2 2 2 3 3

评测用例规模与约定

对于 30% 的评测用例,1 <= n <= 1000,1 <= a[i] <= 1000。
对于 50% 的评测用例,1 <= n <= 10000,1 <= a[i] <= 10000。
对于所有评测用例,1 <= n <= 1000000,1 <= a[i] <= 1000000

思路1:树状数组

首先说树状数组
先挖掘一下题意,遍历序列,对于遍历的元素的一段区间,求最值。随着遍历的进行,区间内的元素在变化,也就是说要修改元素,对于区间最值,我们可以使用二分的方法来查找。
具体的做法是,维护一个关于当前遍历的元素一定大小区间(2k + 1)记录数值的树状数组。每一次遍历通过二分查找,查找这段区间数值的最小值。

代码

N = 100010tr = [0] * N
a = [0] * Ndef lowbit(x) : return x & -xdef add(x, c) :i = xwhile i <= n :tr[i] += ci += lowbit(i)def ask(x) :res = 0i = xwhile i :res += tr[i]i -= lowbit(i)return resdef init() : # 初始化,将第一个元素右边的m个元素初始化树状数组for i in range(1, m + 1) :add(a[i], 1)n = int(input())
a[1 : n + 1] = list(map(int, input().split()))
maxn = max(a[1 : n + 1])
m = int(input())
init()
for i in range(1, n + 1) : if i + m <= n : # 随着区间的挪动添加元素add(a[i + m], 1)if i - m - 1 >= 1 : # # 随着区间的挪动删除元素add(a[i - m - 1], -1)l, r = 0, maxn # 二分查找,右半段查找最小值while l < r :mid = (l + r) >> 1if ask(mid) >= 1 :r = midelse :l = mid + 1print(l, end = " ")

思路2:滑动窗口

通过上面的描述,显然说的就是滑动窗口啊。
维护一个窗口大小为2 * k + 1的单调递减队列即可。

代码

N = 1000010a = [0] * N
q = [0] * Nn = int(input())a[1 : n + 1] = list(map(int, input().split()))m = int(input())hh, tt = 0, -1def init() : # 初始化,将前m个进队列,这时只需要保持单调性即可global ttfor i in range(1, m + 1) :while hh <= tt and a[q[tt]] >= a[i] :tt -= 1tt += 1q[tt] = i
init()for i in range(m + 1, n + m + 1) :while hh <= tt and i - q[hh] + 1 > 2 * m + 1 :hh -= 1if i <= n : # 防止序列越界while hh <= tt and a[q[tt]] >= a[i] :tt -= 1tt += 1q[tt] = iprint(a[q[hh]], end = " ")

思路3:线段树

思路同树状数组,区间查询。

N = 1000010class Tree :def __init__(self) :self.l = 0self.r = 0self.v = 0tr = [Tree() for _ in range(N * 4)]
a = [0] * Ndef pushup(u) :tr[u].v = min(tr[u << 1].v, tr[u << 1 | 1].v)def build(u, l, r) :tr[u].l, tr[u].r = l, rif l == r :tr[u].v = a[l]returnmid = l + r >> 1build(u << 1, l, mid)build(u << 1 | 1, mid + 1, r)pushup(u)def query(u, l, r) :if l <= tr[u].l and tr[u].r <= r :return tr[u].vres = 10000010mid = tr[u].l + tr[u].r >> 1if l <= mid :res = query(u << 1, l, r)if r > mid :res = min(res, query(u << 1 | 1, l, r))return resn = int(input())a[1 : n + 1] = list(map(int, input().split()))m = int(input())
build(1, 1, n)for i in range(1, n + 1) :l, r = max(1, i - m), min(i + m, n)print(query(1, l, r), end = " ")

思路4:RMQ

from math import logN = 1000010a = [0] * N
f = [[1000010] * 25 for _ in range(N)]n = int(input())a[1 : n + 1] = list(map(int, input().split()))
m = int(input())def init() : # 预处理st表for i in range(1, n + 1) :f[i][0] = a[i]k = int(log(n, 2)) + 1for length in range(1, k) :for l in range(1, n + 1) :r = l + (1 << length) - 1if r > n : breakf[l][length] = min(f[l][length - 1], f[l + (1 << (length - 1))][length - 1])def query(l, r) :k = int(log(r - l + 1, 2))return min(f[l][k], f[r - (1 << k) + 1][k])init()for i in range(1, n + 1) :l, r = max(1, i - m), min(i + m, n)print(query(l, r), end = " ")

相关内容

热门资讯

iPhone手机怎么玩安卓系统... 你有没有想过,你的iPhone手机竟然也能玩安卓系统?没错,就是那个一直以来让你觉得遥不可及的安卓世...
平板删安卓系统更新不了,原因及... 最近是不是你也遇到了这样的烦恼?平板电脑上的安卓系统更新不了,是不是让你头疼得要命?别急,今天就来给...
苹果组装机安卓系统卡,卡顿背后... 你有没有发现,最近用苹果手机的时候,有时候系统有点卡呢?这可真是让人头疼啊!你知道吗,其实这背后还有...
安卓系统原生浏览器,功能与体验... 你有没有发现,每次打开手机,那个小小的浏览器窗口总是默默无闻地在那里,陪你浏览网页、搜索信息、看视频...
安卓机如何上苹果系统,跨平台体... 你是不是也和我一样,对安卓机和苹果系统之间的切换充满了好奇?想象你的安卓手机里装满了各种应用,而苹果...
安卓导入系统证书失败,原因分析... 最近在使用安卓手机的时候,你是不是也遇到了一个让人头疼的问题——导入系统证书失败?别急,今天就来给你...
安卓原生系统有哪些手机,盘点搭... 你有没有想过,为什么有些手机用起来就是那么流畅,那么顺心呢?这背后可大有学问哦!今天,就让我带你一起...
安卓系统关机了怎么定位,安卓系... 手机突然关机了,是不是有点慌张呢?别担心,今天就来教你一招,让你的安卓手机即使关机了,也能轻松定位到...
安卓系统游戏加速器,畅享无延迟... 你有没有发现,手机游戏越来越好玩了?不过,有时候游戏体验可能并不那么顺畅,是不是因为手机性能不够强大...
安卓4系统天气功能,尽在掌握 安卓4系统天气功能大揭秘在当今这个数字化的世界里,手机已经不仅仅是一个通信工具,它更是一个集成了各种...
安卓系统如何玩碧蓝幻想,攻略与... 你有没有想过,在安卓系统上玩《碧蓝幻想》竟然可以这么酷炫?没错,就是那个让你沉迷其中的二次元大作!今...
安卓系统搜不到图朵,图朵生成之... 最近是不是你也遇到了这样的烦恼?手机里明明有那么多美美的图片,但是用安卓系统搜索的时候,却怎么也找不...
魁族8刷安卓系统,系统升级后的... 哇,你知道吗?最近在安卓系统圈子里,有一个话题可是引起了不小的轰动,那就是魁族8刷安卓系统。你是不是...
微信正版安装安卓系统,畅享沟通... 你有没有想过,你的微信是不是正版安装的安卓系统呢?这可不是一个小问题哦,它关系到你的微信使用体验和隐...
电视能刷安卓系统吗,电视也能刷... 电视能刷安卓系统吗?揭秘智能电视的无限可能想象你家的电视不再只是用来观看节目的工具,而是变成了一个功...
安卓系统开通通知功能,畅享智能... 你知道吗?最近安卓系统更新后,新增了一个超级实用的功能——开通通知功能!这可是个大喜事,让咱们的生活...
苹果系统安卓爱思助手,系统兼容... 你有没有发现,手机的世界里,苹果系统和安卓系统就像是一对欢喜冤家,总是各有各的粉丝,各有各的拥趸。而...
安卓系统占用很大内存,揭秘内存... 手机里的安卓系统是不是让你感觉内存不够用,就像你的房间堆满了杂物,总是找不到地方放新东西?别急,今天...
安卓系统p30,安卓系统下的摄... 你有没有发现,最近安卓系统P30在手机圈里可是火得一塌糊涂呢!这不,我就来给你好好扒一扒这款手机的那...
siri被安卓系统进入了,智能... 你知道吗?最近科技圈可是炸开了锅,因为一个大家伙——Siri,竟然悄悄地溜进了安卓系统!这可不是什么...